Training of C-Programming at Izumi Lab.


©2007 by T.IZUMI

# いずみ研 Ｃプログラミング練習課題

## ＷＡＶ音声をハンドルするプログラム

### 課題０

### Windows サウンドレコーダー(Start Menu → プログラム → アクセサリ → エンターテイメント) で自分の歌声を録音＆再生してみよ。wav 形式で保存せよ。

Windows Media Player で Wav ファイルを再生させて、波形を確認せよ（タイトルバー右クリック → 表示 → 視覚エフェクト → バーとウェーブ → スコープ）。周波数成分を確認せよ。（同 → 海の霧）

### 課題１

### ＷＡＶファイルを読み込んで、音の大きさを半分にして出力するプログラムを書け。

### 課題２

### ステレオのＷＡＶファイルを読み込んで、モノラルにして出力するプログラムを書け。

### 課題３

### ＷＡＶファイルを読み込んで倍速にして出力するプログラムを書け。サンプリング周波数は変更せずにデータ間引きで実現すること。

例： 変換前 → 変換後

### 課題４

### ＷＡＶファイルを読み込んで時間は半分なんだけど音の高さは変わらない、そんな変換をして出力するプログラムを書け。

例： 変換前 → 変換後

### テスト用データ

立命館大学歌
立命館大学歌の冒頭、人による歌唱
test-orig.wav
PCM, 16bit, monoral, 44.1kHz, 917504samples, 1.8Mbytes, 20sec
ステレオ→モノラル変換のテストデータ
作為的に構成した意地悪データ。左右正相、右のみ、左のみ、左右逆相の４音。
これはうまく扱えなくても良い。
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

ＷＡＶファイルについては
http://www.google.co.jp/
あたりで「wav」「ファイル」「形式」といったキーワードで検索すると
いろいろな情報が得られるでしょう。
ＷＡＶにもいろいろモードがありますが、最も簡単なリニアＰＣＭのみでＯＫです。
Ｃ言語については、本もたくさんあります。各自勉強してください。
理解もせずにやみくもに書きうつすのでは勉強になりません。
理解せずに書き写すような時間の無駄をするくらいなら、睡眠時間に充てたほうがマシです。
逆に、理解の助けのためであれば何を見ても何を調べても何を聞いても構いませんし、
結果として既存のものとほぼ同じプログラムになってしまったとしても全く構いません。

### 参考

### 泉の参考プログラムと結果

まだみせてあげません。

泉 知論
＠
立命館大学
理工学部
電子情報デザイン学科