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;
未定義の動作を避けるため。同じ問題がまだ適用されます。