6

800Hz の正弦波 (1 チャンネル、8 ビット、16000Hz サンプリング、32000 サンプルなので 2 秒の長さ) の .wav ファイルを生成するプログラムを c++ で作成しましたが、Audacity で再生したりスペクトログラムを調べたりすると、倍音。

問題は、正弦波を PCM に変換するアルゴリズムにあると思います。127、127.5、128 などの「ゼロ」変位をどこに置くべきかわかりません。

char data[32000];
for (int j = 0; j < 32000; ++j)
{
    data[j] = (char) (round(127 + 60 * (sin(2.0 * 3.14159265358979323846264338327950 * j / 20.0))));
}

生成されるファイルは次のとおりです: output.wav

必要に応じて、cpp ファイルを次に示します: wavwriter.cpp

ありがとう!

編集 2: char を uint8_t に変更しました

uint8_t data[32000];
for (int j = 0; j < 32000; ++j)
{ 
    data[j] = round(127 + 60 * (sin(2.0 * 3.14159265358979323846264338327950 * j / 20.0)));


}
outfile.write((char *)&data[0], sizeof data);


outfile.close();
return true;

未定義の動作を避けるため。同じ問題がまだ適用されます。

4

1 に答える 1