MCU が周期的な正弦波を生成する仕組み

1. はじめに

シナリオによっては、正弦波オーディオ データを再生するために、マイクロコントローラーの IIS などの周辺機器を使用する必要があります。この記事では、固定周波数および固定振幅の正弦波固定小数点データを生成し、学習および使用のために記録および要約する「愚かな方法」を紹介します。

2、ステップの導入

总体步骤概述:
1,使用Audition生成制定波形,并转成pcm格式;
2,写个main函数将所需要的数据读取并打印,然后运行重定向到txt中;
3,将txt中的数据复制到IIS的播放buffer中进行播放即可;

この記事では、例として、サンプリング レート 48K、振幅 -6db、周波数 1KHz の正弦波信号を使用します。

2.1 Audition を使用して指定された波形を生成し、それを PCM 形式に変換します

Auditionを開き、トーンを生成します:
ここに画像の説明を挿入
新しいオーディオファイルを作成し、OKをクリックします:
ここに画像の説明を挿入
波信号の周波数と振幅を設定します 開始: 波
ここに画像の説明を挿入
信号の終わりの周波数と振幅を設定します:
ここに画像の説明を挿入
「OK」をクリックすると、ステレオ指定された音源が作成されます準備完了:
ここに画像の説明を挿入
オーディションのショートカット キー「Alt+Z」を使用して、生成された波形信号の周波数を表示します。「選択範囲のスキャン」をクリックして、左右のチャンネルの周波数が 1KHz であることを確認します。現在の浮動小数点データを固定小数点データに変換します
ここに画像の説明を挿入
。 -ポイント データの場合は、ショートカット キー「Ctrl + S」を使用し、ファイルを .pcm 形式で保存し、指定したパスに保存します。
ここに画像の説明を挿入

これまでに、オーディオ ソース ファイルが生成され、準備されました。

2. 必要なデータを読み取って出力する main 関数を作成し、それを txt にリダイレクトします。

主な関数コードは次のとおりです:
ここで IN_32BITPCM_FILE は生成されたばかりの pcm ファイルを使用します;
DATA_SAMPLE_LEN は 96 に設定されます。これは、1KHz の周波数周期が 1ms、48K サンプリング レートが 1ms のサンプリング ポイントの数が 48 であるためです。ステレオなので、ここをお読みください。 96 個のサンプリング ポイントを取得します。

#include <stdio.h>

#define IN_32BITPCM_FILE "-6db_1K_48KSr.pcm"
#define READ_DATA_SAMPLE_LEN    96

int main()
{
    
    
	int ret = -1;
	FILE *fp = NULL;
	int buffer[READ_DATA_SAMPLE_LEN] = {
    
    0};

	fp = fopen(IN_32BITPCM_FILE,"rb");
	if(fp == NULL) {
    
    
		printf("%s: open file failed \n",__func__);
		return -1;
	}

	fseek(fp,0,SEEK_SET);
	ret = fread(buffer,sizeof(char),READ_DATA_SAMPLE_LEN*sizeof(buffer[0]),fp);
	if(ret <=0 ) {
    
    
		printf("%s: ERROR:read file data failed \n",__func__);
		fclose(fp);
		return -1;
	}

	for(int i=0; i< READ_DATA_SAMPLE_LEN; i++){
    
    
		printf("0x%08X, ", buffer[i]);
		if(((i+1)%8) == 0){
    
    
			printf("\n");
		}
	}
	fclose(fp);

	return ret;
}

MINGW64 を開いて main 関数をコンパイルし、デフォルトで a.exe を生成します。
ここに画像の説明を挿入
a.exe を実行し、出力結果を test.txt にリダイレクトします。
ここに画像の説明を挿入
test.txt を開いて、生成された正弦波固定小数点データを表示し、必要なデータはすでにきちんと整理されています:
ここに画像の説明を挿入

2.3 次に、指定した配列にデータをコピーします

備考: 生成されたデータをオーディオ再生のバッファーと一致させるために、ここでサイクル データのコピーをさらにいくつかコピーし、ループして完全なサイクルを生成するデータを格納する配列からデータをフェッチしてコピーできます。それをオーディオ再生のバッファ配列に入れることができます。

3、まとめ

この記事では、固定小数点データの正弦波を生成する愚かな方法を主に紹介しますので、参考にしてください。フォローアップでは、CORDIC アルゴリズムを使用して、さまざまな周波数、振幅、サンプリング レートの正弦波形を生成する方法を紹介します。議論や交換を歓迎します~

おすすめ

転載: blog.csdn.net/xuxu_123_/article/details/131317829