©2007 by T.IZUMI
いずみ研 Cプログラミング練習課題
WAV音声をハンドルするプログラム
課題0
Windows サウンドレコーダー(Start Menu → プログラム → アクセサリ → エンターテイメント) で自分の歌声を録音&再生してみよ。wav 形式で保存せよ。
Windows Media Player で Wav ファイルを再生させて、波形を確認せよ(タイトルバー右クリック → 表示 → 視覚エフェクト → バーとウェーブ → スコープ)。周波数成分を確認せよ。(同 → 海の霧)
課題1
WAVファイルを読み込んで、音の大きさを半分にして出力するプログラムを書け。
課題2
ステレオのWAVファイルを読み込んで、モノラルにして出力するプログラムを書け。
課題3
WAVファイルを読み込んで倍速にして出力するプログラムを書け。サンプリング周波数は変更せずにデータ間引きで実現すること。
例: 変換前 → 変換後
課題4
WAVファイルを読み込んで時間は半分なんだけど音の高さは変わらない、そんな変換をして出力するプログラムを書け。
例: 変換前 → 変換後
テスト用データ
- 立命館大学歌
- 立命館大学歌の冒頭、人による歌唱
test-orig.wav
PCM, 16bit, monoral, 44.1kHz, 917504samples, 1.8Mbytes, 20sec
- ステレオ→モノラル変換のテストデータ
- 作為的に構成した意地悪データ。左右正相、右のみ、左のみ、左右逆相の4音。
これはうまく扱えなくても良い。
trickyexample-stereo2mono.wav
PCM, 16bit, stereo, 44.1kHz, 352800samples, 1.4Mbytes, 8sec
- 単純正弦波の和音
- ch0: 周期512/3=171サンプルの sin と周期512/7=73サンプルのcos
ch1: 周期512/5=102サンプルの sin と周期512/9=57サンプルのcos
フーリエ変換後は相当する場所にピークがでる。
ブロックサイズ 4096 なら
ch0 の +24 虚部にプラス、-24(4072) 虚部にマイナス、
+56 実部にプラス、-56(4040) 実部にプラス、
ch1 の +40 虚部にプラス、-40(4056) 虚部にマイナス、
+72 実部にプラス、-72(4024) 実部にプラス。
- test-16-s3c7-s5c9.wav
PCM, 16bit, stereo, 44.1kHz, 65536samples, 256Kbytes, 1.5sec
- test-16-s3c7.wav
PCM, 16bit, monoral, 44.1kHz, 65536samples, 128Kbytes, 1.5sec
- test-08-s3c7-s5c9.wav
PCM, 8bit, stereo, 44.1kHz, 65536samples, 128Kbytes, 1.5sec
- test-08-s3c7.wav
PCM, 8bit, monoral, 44.1kHz, 65536samples, 64Kbytes, 1.5sec
- test-16-s3c7-s5c9-freq.txt
参考までにフーリエ変換後の生データの例
- 数値確認用データ
- 16/8bit, monoral/stereo のデータ形式が正しく読めているかどうか確認するためのデータ。
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7 が繰り返し並んでいるだけ。
それぞれ読み込んだときに次のような値になっているか確認すること。
※恐らく音は鳴らない。プログラム中で printf するなどして確認する。
- test-triv-16s.wav
PCM, 16bit, stereo, 44.1kHz, 16384samples, 64Kbytes
0ch = {-15936, -14908, -15936, -14908, …の繰り返し… }
1ch = {-15422, -14394, -15422, -14394, …の繰り返し… }
- test-triv-16m.wav
PCM, 16bit, monoral, 44.1kHz, 32768samples, 64Kbytes
0ch = {-15936, -15422, -14908, -14394, -15936, -15422, -14908, -14394, …の繰り返し… }
1ch = なし
- test-triv-08s.wav
PCM, 8bit, stereo, 44.1kHz, 32768samples, 64Kbytes
0ch = {192, 194, 196, 198, 192, 194, 196, 198, …の繰り返し… }
1ch = {193, 195, 197, 199, 193, 195, 197, 199, …の繰り返し… }
- test-triv-08m.wav
PCM, 8bit, monoral, 44.1kHz, 65536samples, 64Kbytes
0ch = {192, 193, 194, 195, 196, 197, 198, 199, 192, 193, 194, 195, 196, 197, 198, 199, …の繰り返し… }
1ch = なし
- 単純正弦波のデータ
- wav ファイルではないが、フーリエ変換等周波数操作の基本的確認のための生データ。
- cos56sin24.txt 4096サンプル、周波数56のcosと周波数24のsinの和の数列
- real56imag24.txt 4096サンプル、上記に対応する周波数データの複素数列
tips
- WAVファイルについては
http://www.google.co.jp/
あたりで「wav」「ファイル」「形式」といったキーワードで検索すると
いろいろな情報が得られるでしょう。
WAVにもいろいろモードがありますが、最も簡単なリニアPCMのみでOKです。
- C言語については、本もたくさんあります。各自勉強してください。
- 理解もせずにやみくもに書きうつすのでは勉強になりません。
理解せずに書き写すような時間の無駄をするくらいなら、睡眠時間に充てたほうがマシです。
逆に、理解の助けのためであれば何を見ても何を調べても何を聞いても構いませんし、
結果として既存のものとほぼ同じプログラムになってしまったとしても全く構いません。
参考
泉の参考プログラムと結果
泉 知論
@
立命館大学
理工学部
電子情報デザイン学科
戻る