スポンサーサイト

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

WAVプログラミング #19

いきなりですが、「サンプリング定理」を述べます。
ある波形を正しく標本化するには、波形の持つ周波数成分の帯域幅の2倍より高い周波数で標本化する必要がある。
逆に言えば、サンプリング周波数が決まっている場合は、サンプリング周波数の1/2までの周波数にしておく必要がある。

例えば、サンプリング周波数が44.1kHzの場合、約22kHz以下の信号のみにする、つまり、約22kHzでローバスフィルターを通しておく必要があるということです。

同じようにサンプリング周波数が22kHzの場合は約11kHz以下の信号のみにしておく必要があります。


じゃあ、もしそれをやらなかったらどうなるのか?
前回の40Hz~20kHzのスイープ信号をサンプリング周波数22kHzで実験してみました。



おそらく11kHzくらいだと思われる周波数で、折り返しています。
本来は11kHz+α で鳴るべき音が、11kHz - αの音で鳴ってしまっています。
このようにサンプリング定理を守らないと、このような現象が生じてしまいます。

これが エイリアシング と呼ばれる現象です。(多分)



スポンサーサイト

WAVプログラミング #18

9章まだ引っぱります。
今回は、サイン波を周波数40Hz~約20kHzでスイープさせてみました。



人間の可聴周波数は20Hz~20kHzと言われています。
みなさんは、どこまで聞けましたか?

ただ、ムービーファイルにした時点で、音声が圧縮されてしまっているっぽいので、正しくは鳴っていませんが・・・

WAVプログラミング #17

という訳で、9章 波形生成のデモ 修正版です



これでスッキリ解決です。

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から利用できます。興味のある人は買ってみてはいかがでしょうか?

WAVプログラミング #15

さて、前回の記事の動画デモ、440Hzの音ですが、違和感を感じた人はいないでしょうか?
動画の音最後の三角波の音程(ピッチ)が他の波形の音に比べ、低いように感じられます。

前回の記事の実行プログラムは本に付属したCD-ROMから一切改造していないので、音色の違いとかパソコンの仕様でそう聞こえるだけなのかなと思っていたのですが、やはり気になるので、色々な周波数で聞いてみることにしました。

今回のデモでは、数種類の周波数の正弦波と三角波を、本に付属されているCD-ROM実行プログラムそのままから作成しました。
低い方から順に、100Hz、200Hz、1kHz、4kHz、10kHzで、正弦波と三角波を交互に再生しました。
また、スペクトラムがわかりやすいようににWindows Media Playerの視覚エフェクトを「バーとウェーブ」にしています。

では早速、聞き比べてみよう




1kHzのときに、明らかにピッチが違うことが聞き取れます。
また、10kHzのときのスペクトラムは、波形のピークの位置が明らかに異なっていることを目でも確認できました。
ピッチずれは、周波数が高ければ高いほど、大きい傾向にあるようです。

次回、この原因と対策を考えたいと思います。



※ちなみにYouTubeにUPした時点で圧縮されているため音質が悪いですが、実際はもっと良い音質です。

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

WAVプログラミング #14

9章 波形生成のデモです



方形波、ノコギリ波、正弦波、三角波の波形を生成です。
周波数は440Hz、つまり "ラ" の音です。
原始的な方法ですが、いろんな周波数(音階)を作って連続再生すれば、メロディーも作成可能です。


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

WAVプログラミング #13

UPとくれば、DOWNです
7章7-1の続き。



0.1倍になると、幻聴なのか、モンスターの鳴き声が聴こえてきます。
さらにスキップして聞くと、何かが爆発? この世の終わりか?
なかなか楽しめます



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

WAVプログラミング #12

いきなり飛びますが7章7-1のデモです。
再生スピードを変更し、速くしています。



1倍、1.2倍、2倍、3倍、5倍、10倍、20倍と変化させてみました。
1.2倍とかWAVEファイルのままで聴くと音質がいいんですけどね。
WMVに変換された時点で圧縮さているようです。

このプログラムは、実際のデータを変更しているわけではなく、ヘッダの一部のみを書き換えているだけでの簡単なものです。
だけど、効果は大きい。
今回のデモにはありませんが、歌入りのWAVファイルや自分の声を録音したWAVファイルで試してみると非常に面白いです。


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

WAVプログラミング #11

今回は3章3-4のプログラムデモです。
ステレオWAVファイルに対し、
5秒間隔でモノラル→ステレオ→モノラル→ステレオ→モノラル と変化します。



ヘッドフォンで聞くとわかります。
オリジナルWAVファイルは、アコースティックギターの音2つが左右に分かれて録音されています。
モノラルのとき、2つとも音の定位がセンターになります。
アップしておいて何ですが、う~ん、あまり面白みは無いですね。



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

WAVプログラミング #10

今回は2章2-3のプログラムデモです。
ステレオWAVファイルの左右チャンネルを交互に周期的に消します。



オリジナルプログラムでは、秒単位でしか処理できませんが、ミリ秒単位でできるように改造しました。
100msecの周期的な切り替えは、ちょっと聞いているとイライラしてきます。
10msecでは、イライラを通り越し、宇宙人的な音楽に聴こえてきます。
1msecでは、切り替えているのが耳で追いつかない状態です。
最後に、リズム良く切り替えてみました。
切り替え時にポツポツ音がなるのは、ゼロだったデータが急峻に立ち上がったり、今まで出していたデータが急峻に立ち下がる場合があるからです。
いわゆるゼロクロスになるように調整をすれば、もっと聞きやすくなるかと思います。


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

WAVプログラミング #9

WAVプログラミング2章2-1のデモです。
左チャンネルの音を消します。



別に大したことないじゃんと思うかもしれませんが、このプログラムはこれ以後のデモの基礎になります。


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

WAVプログラミング #8

さてさて、2章のデモに入る前にもう一つ。

ReadLineメソッドを活用しよう
今回のWAVプログラミングはコンソールアプリケーション(実行環境がMS-DOSってこと)で出来ていますので、標準ストリームからの入出力を使います。

(09_08_20) consoleアプリ

ConsoleクラスのWrite、WriteLine、Read、ReadLineがそれに当たります。
C言語で言うところの、printf と scanf に相当します。

2章の2-1のプログラム Mainメソッドのtryのすぐ下の

if分 294~298行目 を削除またはコメントアウトし、

if (args.Length < 1)
{
Console.WriteLine("実行ファイルアイコン自体へ元ファイルをドラッグ&ドロップしてください");
Console.Read();
return;
}

string OutputFile;
Console.WriteLine("出力ファイル名を入力してください");
OutputFile = Console.ReadLine();
OutputFile= "D:\\temp\\"+OutputFile+".wav";

Console.WriteLine("\n{0} というファイルを作成します", OutputFile);
Console.Read();


へ変更しました。
それに伴い、Mainメソッドの下の方、「書き込み」のところですが、
318行目のif分の中のメソッド呼び出し2番目の引数OutputFile へ変更しました。


String型変数「Output」にReadLineメソッドでコマンドラインからファイル名を代入させ、パスや拡張子を付けています。
C言語と異なり、文字列はポインタを意識することなく「=」や「+」を使って代入、文字追加ができるので非常に便利です。
所々に、「Console.Read();」という記述ありますが、これはユーザーからエンターキーが押されるまではそのままの状態を保持しておくためのものです。
特にEXEファイルから実行した場合、実行が終わると同時にウインドウがすぐ閉じてしまい、途中経過が見えないので、これを追記しました。

このプログラムで行ったデモを次回の記事に載せます。


※今回の記事は、参考書「WAVプログラミング .NET C#で学ぶ音響処理」を買って読むと内容がよくわかります。
プログラムソースはネットでは公開されていませんので、本に付属しているCD-ROMを利用してください。

WAVプログラミング #7

さて、2章のデモに入る前に、オリジナルのプログラムを少し改造します。
オリジナルのプログラムのままだと、コマンドプロンプトからの実行なので、ちょっと扱いづらい。

そこで、ドラッグ&ドロップとReadLineメソッドを活用します。
(09_08_19) ドラッグandドロップ

ドラッグ&ドロップを活用しよう
Mainメソッドにおいて、引数として args というstring型の配列がありますが、これはどこからもらえるかというと2つ方法があります。

①コマンドプロンプトからもらう
例えば実行ファイル名が「test.exe」だった場合、コマンドプロンプトにて実行ファイルの置いてあるディレクトリに移動し、

test.exe aaa bbb ccc.wav

と打ち込むと、プログラム内部では
args[0] には "aaa" が
args[1] には "bbb" が
args[2] には "ccc.wav" が
代入されます。


②実行ファイルにドラッグ&ドロップする
そのままです。
実行ファイルにドラッグ&ドロップすると、実行ファイルが実行され、args[0]に ファイルのパス+ファイル名が代入されます。
例えば、Cドライブの直下にある「sample.wav」という名前のファイルを、実行ファイルにドラッグ&ドロップすると、実行ファイルが実行され、args[0]には"C:\sample.wav"という文字列が代入されます。

つまり、②を利用することにより、Mainメソッドの一番目の引数(args[0])に対し、キーボードで打ち込む必要がなくなります。



※今回の記事は、参考書「WAVプログラミング .NET C#で学ぶ音響処理」を買って読むと内容がよくわかります。
プログラムソースはネットでは公開されていませんので、本に付属しているCD-ROMを利用してください。

WAVプログラミング #6

今回買った参考書「WAVプログラミング .NET #Cで学ぶ音響処理」の実際の作業デモです。
第1章のダンプです。主にWAVファイルのヘッダ情報を表示しています。



上記デモでは、Visual C#を立ち上げていますが、本のCD-ROMにはサンプルプログラム及び実行ファイルが既に用意されていますので、WAVファイルさえ用意すれば、すぐに色々試すことが可能です。
興味のある人はこの本を買って試してみよう。

今回はヘッダ情報の表示なので、音が直接聞けませんでしたが、今後は音のデモもアップする予定です。

WAVプログラミング #5

dataチャンクのデータの中身を見てみよう

(09_08_17) WAV

この画像は、ステレオ、16bit/sampleのWAVファイルのデータチャンクの一部を表示したものです。
16bitを1データとして、2データを1列に表示させています。

dataチャンクのデータの中身は単純で、Lchのデータ、Rchのデータ、Lchのデータ、Rchのデータ・・・・ というように交互に記録されています。
またデータが8bitであれば、各データは0~255の範囲内の値で、無音を意味する値は半分の128です。
同様にデータが16bitであれば、各データは-32768 ~ +32767の範囲内の値で、無音を意味する値は半分の0です。

つまり、上の画像は左側がLch 16bitのデータ値、右側がRch 16bitのデータ値を示していることになります。

なお、モノラルの場合は、そのまま8bitずつ、もしくは16bitずつ記録されるだけです。

(09_08_17) WAV2


03 | 2017/04 | 05
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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。