スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WAVプログラミング #16

さて、三角波のピッチが低い原因と対策です。

原因
本に書いてある内容なので、あまり詳しくは言えませんが、9章9-4のプログラムは、丸め誤差を含む値を使って波形の周期が生成されているためです。
実際、1周期あたりサンプリング数2つ分だけ、波形が長くなってしまっています。
サンプリング周波数が44.1kHzなので、440Hzの場合、1周期あたりのサンプリング数は44.1k×1/440で約100です。つまり2%のずれです。
同様に1kHzの場合だと約44なので、約5%のずれ、10kHzの場合だと約4 なので約45%のずれ。
つまり、周波数が高いほどずれの影響度が大きい異なる周波数の波形が生成されていたのです。


対策
178~198行目のfor分を削除またはコメントアウトします。
その下に以下のプログラムを追記します。

//三角波の1周期におけるサンプリング数 sampPerCycle を利用する
for (int i = 0; i < param.dataChank.sizeOfFmtData / 4; i++)
{
if (curSampling < (sampPerCycle / 2)) //三角波の前半の場合
{
curLevel = deltaPriod * curSampling;
}
else if (curSampling < sampPerCycle)//三角波の後半の場合
{
curLevel = 65535 - deltaPriod * (curSampling - (sampPerCycle / 2));
}
else //1周期を超えた場合
{
curLevel = 0.0f;
curSampling = 0;
}

Out[0] = Out[1] = (short)(curLevel - 32768.0f);

bw.Write(Out[0]);
bw.Write(Out[1]);

curSampling++;
}


これでOKです。
オリジナルの9章9-4のプログラムは、なぜか9-1~9-3とやり方を変えていたり、意味のない記述があったりしてます。
作者が締め切りに追われて慌てて作ってしまったのでしょうかね

次回は、この修正プログラムを使って、再び各種波形の動画修正版をUPします。


※元のプログラムソース及び実行ファイルは、書籍「WAVプログラミング .NET C#で学ぶ音響処理」に付属しているCD-ROMから利用できます。興味のある人は買ってみてはいかがでしょうか?
スポンサーサイト

comment

管理者にだけ表示を許可する

10 | 2017/11 | 12
Su Mo Tu We Th Fr Sa
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
プロフィール

エレクトリックバカ

Author:エレクトリックバカ

ポケコンでプログラミングに目覚め、PICマイコンで電子工作に希望を抱き、来たるべきUGDの時代を夢見て眠る。
そんな うだつが上がらないサラリーメン。
先生、電子工作はおやつに入りますか?




Electric Baka

最新記事
カテゴリ
月別アーカイブ
最新コメント
最新トラックバック
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。