coskxVersionUp16June2003PDF版1.バイナリファイルの扱い(第1週)1.1テキストファイルとバイナリファイルテキストファイル:テキストエディタで書いたり読んだり出来るファイル。バイナリファイル:テキストファイル以外のファイル。実行形式ファイルやデータファイルなど。1.2ファイルのバイナリオープンファイルのオープンにはテキストオープンとバイナリオープンがある。テキストファイルのみをオープンする場合はテキストオープンするが,そうでない場合はバイナリオープンする。バイナリファイルはバイナリオープンしないと正しく読んだり書いたり出来ない。ファイルのオープンの際に,テキストファイルの場合はfp=fopen(argv[1],"r");fp=fopen(argv[1],"w");と書くがバイナリファイルの場合はfp=fopen(argv[1],"rb");fp=fopen(argv[1],"wb");と書く。バイナリファイルに対して,1バイトデータに対してfgetc(),fputc()を使うこともあるが,複数バイトの読み込み書き出しに関してはfread()あるいはfwrite()が使われ,fgets()やfputs()は使われない。ファイルをバイナリオープンして,先頭の100文字をそのまま表示するプログラムtypeFile100.cを次に示す。表示とバイナリ表示(16進数表示)の両方を表示するプログラムtypeFile.cを作りなさい。テキスト表示する場合は0x21以上0x7e以下のみ通常表示し,それ以外は小数点を表示することにします。ソースファイルと実行形式ファイルを表示しなさい。例としてソースファイルを対象にした時の表示例を次に示す。Windowsの時の例)ヒント:関数fgetc(),fread()について検討しなさい。65提出するテキストファイル書式は次の通りとします。(本講義での提出テキストファイルはすべてこの形式にします。ダンププログラムはファイルの内容をバイナリ表示(16進表示)とテキスト表示を対応がわかるように表示するプログラムである。お,テキスト表示では0x21以上0x7e以下のみ通常表示し,それ以外は小数点を表示することにします。「typeFile100.c」をダンプしたところである。ような表示形式のファイルのダンププログラムdumpFile.cを作成しなさい。対象ファイル名はコマンドラインから入力することとします。出はtnct20の各自のpublic_htmlにファイル名「dumpFile.txt」で公開することにします。書式は課題1と同じにします。この形式のファイルはヘッダ部とデータ部とで構成されている。ヘッダ部にはwav形式であることやサンプリングに関する情報が書かれている。タ部はサンプリングされたデータ列が保存されています。ヘッダ部は表3.1のような構成となっている。村亮先生の資料から引用し,小坂が加筆しています。項目1,3,4,12,14,*2,*3以外の項目は,それぞれのサイズの整数であり,いずれもバイナリで書かれる.2バイト以上に渡る整数値は下位バイトから順に並んでいる。バイナリで書かれる.図3.1は16bitの場合のサンプルデータの例であり,また図3.2は8bitの場合のサンプルデータ例である。振幅値が0(無音)の場合の量子化値は,量子化ビット数が8[bit]の場合は128(0x80),16[bit]の場合は0(0x0000)である.Wavファイルの先頭部の例を次に示します。1サンプルデータが16bitで出来ている場合と8bitで出来ている場合の例を図3.1,3.2に示す。値域は-32768〜32767であり,無信号時の値は0である。値域は0〜255であり,無信号時の値は128である。3(1)wavファイルを課題2で作成したdumpFileでダンプし,各項目内容を調べて表にまとめなさい。(2)wavファイルのヘッダ部分を読み出し,コンソール画面に表示するプログラムextractInfo.cを作成しなさい。表3.1の*1〜*4は表示しない事にします。プログラムおよび結果をファイル名「extractInfo.txt」で公開しなさい。書式は課題1と同じにします。dumpFile.cを用いたダンプ結果は「まとめと感想」に書きなさい。この課題では次の2つのwavファイルを対象として用いてよい。他のwavファイルを対象としてもよい。「項目6〜11,*1*2」のサイズを覚えておき,項目6〜11を読み取る。は*1*2があるという意味なのでこの部分は読み飛ばす。バイト数を知り,*5を読み飛ばす。次に4文字読んで文字列'data'だったら,次の項目13でサウンドデータの総バイト数を知ることが出来る。ヒント2:次の3つの関数の役割を考えなさい。次の構造体はwaveファイルのヘッダに対応しているので用いなさい。4次の課題のプログラムを作りなさい。提出用のファイル名はmodifyWaveFile.txtとし,作成したすべてのプログラムをこの中に公開しなさい。書式は課題1と同様にします。すべてのデータはモノラルと仮定しなさい。利用するプログラムとしなさい。(1)wavファイルを読み込み,読み込みデータ中の先頭1秒だけのデータのみで出来ているwavファイルに変換するプログラムshortenWave.cを作りなさい。(File1.wav)(2)wavファイルを読み込み,wavファイルのヘッダ部分,サウンドデータをテキストファイルに変換するプログラムWaveToText.cを作りなさい。サウンドデータは32767〜-32768の範囲で出力されるようにしなさい。(3)wavファイルを読み込み,サンプルデータを逆順にしたwavファイルに変換するプログラムreverseWave.cを作りなさい。「あいうえお」は「おえういあ」に聞こえるでしょう。(File2.wav)(4)wavファイルを読み込み,読み込んだサウンドを2回繰り返すwavファイルに変換するプログラムrepeatWave.cを作りなさい。再生時間は2倍になるはずです。(File3.wav)(5)wavファイルを読み込み,読み込んだサウンドを倍速再生するwavファイルに変換するプログラムfastPlayWave.cを作りなさい。サンプリング周波数を変更していけません。(File4.wav)(6)wavファイルを読み込み,読み込んだサウンドを半速再生するwavファイルに変換するプログラムslowPlayWave.cを作りなさい。サンプリング周波数を変更していけません。次の3つの関数の役割を調べなさい。5与えられた周波数の単一正弦波トーンを表すモノラルの構成のwavファイルをつくるプログラムを作りなさい。(1)トーンの周波数,トーンの継続時間(再生時間),サンプリング周波数,1サンプルデータ当たりのビット数が固定値で,それぞれ1200Hz,3sec,8000Hz,8bitであるプログラムcreateSinWave1.c(2)トーンの周波数,トーンの継続時間(再生時間),サンプリング周波数,1サンプルデータ当たりのビット数が設定ファイルで与えられるプログラムcreateSinWave2.c。設定ファイルの書式は以下のようである。使用されているキーワードはこのまま使うこと。//[bit]提出前にチェック用プログラムpowerspectrumで出力ファイルをチェックしなさい。windows版powerspectrum.exe)設定した周波数に近い離散周波数のパワー値が一番大きければよい。提出はファイル名createSinWave.txtとし,書式はこれまでと同様にしなさい。(1)で作成されたwavファイルをcreatedsinwave.wavの名前で公開しなさい。3秒間の1250Hzのトーンをサンプリング周波数8000Hzで作ることを考えよう。振幅は15000とする。このトーンを時間の関数で表すと,次式となる。1250サンプリング周波数が8000Hzなので,サンプルデータは1秒間に8000個になる。3秒間を構成するサンプルデータ総数は3×8000=24000個となる。サンプリング周波数が8000Hzなので,サンプルデータ間の時間,すなわちサンプリング周期は1/8000秒である。先頭からi番目のサンプルデータは,先頭からi/8000秒である。このトーンのi番目のサンプルデータを数式で表すと次式となる。設定ファイルを読む関数を作ると簡単になる。振幅はフルスケールの80%程度にしなさい。Transform)演算を用いるとサウンドデータのパワースペクトルを求めることが出来る。パワーがどれだけ含まれているかを示す量である。域データ(音の周波数=1200Hz,サンプリング周波数=8000Hz)の周波数分析を行ない,パワースペクトルを求めるプログラムである。