情報処理4レポート課題(12)

更新:2008年12月15日


  1. bfileo1_4_2.cを書き換えて、 レポート課題(10)の問1で作成したプログラム(解答例ではreport10-1.c)を実行することによって作成されるファイルshort1000-1.datから 2バイトづつ1000個のデータを入力してshort型の配列に格納し、 そのi番目の要素にを乗じて、 バイナリファイルshort1000-1new.datに出力するプログラムを作成して下さい。 正しく計算するために、係数中の整数定数には小数点を用い、 整数変数を一旦double型に変換してから計算し、 あらためて配列の要素に代入する際にshort型に変換することに注意してください。
    report12-1.c
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(void){
    	FILE *fp;
    	int chk, i;
    	short a[1000];
    	fp=fopen("short1000-1.dat", "rb");
    	if(fp==NULL){
    		printf("File Can't Open\n");
    		exit(1);
    	}
    	chk=fread(a, sizeof(a[0]), sizeof(a)/sizeof(a[0]), fp);
    	if(chk<1000){
    		printf("Read Error\n");
    		exit(1);
    	}
    	fclose(fp);
    
    	for(i=0;i<1000;i++){
    		a[i]=(2.0*((double)i)+0.8)*a[i];
    	}
    
    	fp=fopen("short1000-1new.dat", "wb");
    	if(fp==NULL){
    		printf("File Can't Open\n");
    		exit(1);
    	}
    	chk=fwrite(a, sizeof(a[0]), sizeof(a)/sizeof(a[0]), fp);
    	if(chk<1000){
    		printf("Write Error\n");
    		exit(1);
    	}
    	fclose(fp);
    	return 0;
    }
    
  2. 次の作業を行って下さい.
    1. このファイルをダウンロードする.
    2. スクリーン右上のスピーカアイコンをクリックしてボリュームを最大値に設定する.
    3. モニタスクリーン下部にあるVolumelボタンを押して,ボリュームを適度に(3くらい?)に設定する.
    4. ファイルsample.wavが保存されているディレクトリで,次を実行する:
      sox -V -r 8000 -s -w -c 1 sample-decay.raw -t ossdsp /dev/dsp0
      音が鳴ったことを確認して下さい. 音が鳴らない場合には,上の作業を確認して下さい.
    5. ファイルsample-decay.wavをemacsでバイナリーモードで閲覧してみて下さい。

    解答例は省略されています。
  3. レポート課題(10)の問2-3で作成した音声RAWファイルpcm-8000Hz-1c-2byte-1000Hz-2sec.rawを入力して、 音量が線形に減衰して最終的に音量0になるように加工してバイナリファイルpcm-8000Hz-1c-2byte-1000Hz-2sec-decay.rawを出力するプログラムを作成して下さい。 また、音声RAWバイナリファイルsparcle0.rawを入力ファイルに指定するとその線形減衰ファイルが得られることを確認してください。 次の問題を解いてからの方が良いと思います。
    report12-3.c
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(void){
    	short a[16000];
    	int chk, i;
    	FILE *fp;
    	fp=fopen("pcm-8000Hz-1c-2byte-1000Hz-2sec.raw", "rb");
    	chk=fread(a, sizeof(a[0]), sizeof(a)/sizeof(a[0]), fp);
    	if(chk<sizeof(a)/sizeof(a[0])){
    		printf("Read Error\n");
    		exit(1);
    	}
    	fclose(fp);
    	for(i=0;i<16000;i++){
    		a[i]=(short)(((double)a[i])*(1.0-((double)i)/15999.0));
    	}
    	fp=fopen("pcm-8000Hz-1c-2byte-1000Hz-2sec-decay.raw", "wb");
    	chk=fwrite(a, sizeof(a[0]), sizeof(a)/sizeof(a[0]), fp);
    	if(chk<sizeof(a)/sizeof(a[0])){
    		printf("Write Error\n");
    		exit(1);
    	}
    	fclose(fp);
    	/***画面表示確認用
    	for(i=0;i<16000;i++){
    		printf("%d\n", a[i]);
    	}
    	***/
    	return 0;
    }
    
  4. 上の問を解くための考察として、 次の「あ」から「け」に適切に埋めてください。

    ファイルpcm-8000Hz-1c-2byte-1000Hz-2sec.rawには、 サンプリングレート8000Hz、モノラル、16ビット符号つきデータとして、2秒間の波形データが格納されているので、 これを入力するために、short型16000個の要素を持つ配列aを用意して、 fread関数を用いて配列aに入力します。

    音量を減衰するには、配列の各要素を1以下の小数で乗じます。 線形に減衰するには、先頭要素については1倍、末尾要素については0倍し、 その間の要素については0から1までの適切な小数で乗じます。 すなわち、0番目の要素に乗じる係数が1.0、 対象データの要素数は16000なので、15999番目の要素に乗じる係数が0.0、 したがって番目の要素に乗じる係数はになります。

以下は皆さんの幾つかの考察・感想に対するコメントです
問題3において波形成分に係数をかけて減衰させる際に、a[i]*= (計算式) で操作しようとしたが音が出なかった。a[i]をdoubleで型変換し、これに係数をかけると成功した。 違いがよくわからなかった。
乗算代入演算子「*=」を用いても可能ですよ。 次のようになると思います。
a[i]*=1.0-((double)i)/15999.0;
ただし暗黙の型変換についてしっかり理解しておく必要があります。
解答3のプログラムがなぜ減衰しないのかわからない。 長時間考えたけれども、原因が掴めない。 正解例が公開されたら、比較して考えようと思う。
for(i=0;i<16000;i++){
        a[i]*=(short)(1.0-(double)(i)/16000);
    }
乗算代入演算子を用いる場合、右辺は各波形データに乗じる係数を表すことになります。 題意から係数は0以上1以下なのでこれをshort型に変換すると1未満の係数はすべて0になってしまいます。 よって乗算代入演算子を用いる場合には右辺をshort型に変換してはいけません。 暗黙の型変換において short型とdouble型の乗算結果がdouble型になることと、 double型をshort型に代入すると小数部分が打ち切られることを利用することになります。 ただし、本科目では暗黙の型変換について詳しく学習していないのでこの方法を公式に勧めることはできません。
型の変更させるタイミングで値が変わって来ることに注意しなければいけない。
これ大事!
音が変なのは最初の式
for(i=0;i<DATASIZE;i++){
          a[i]=(short)(32767.0*sin((2000.0*M_PI)*(1/8000.0)*((double)(i))));
        }
だと思い込んでいましたが、もうひとつの
for(i=0;i<DATASIZE;i++)
          {
            a[i]=(short)((a[i])*((((double)(DATASIZE-1.0))-((double)(i)))/((double)(DATASIZE-1.0))));
          }
が原因だったのに気づくのに時間がかかった。 書き込み側と読み込み側で関係があるのでしょうか??
まず、最初の式は不要ですね。配列aの要素はファイルから入力されることによって設定されるのですから。 もうひとつの式について、不思議な音になる原因は見当たりませんよ。 ただし正式には、a[i]doubleに変換することとDATASIZEdoubleに変換するのですが。
配列の宣言がshortではなく、intになっていたため、ずっとリードエラーになってし まいました。リードエラーになった原因を探すために、どこまでchkに入っているか調べ た所、8000だけ入っていました。なんでintに入り切らなかったのかわかりません。
int型16000個分入力しようとしたら8000個入力したところでデータがなくなってリードエラーが起きたのだと思います。
関数自体に1-i/15999をかけてもできるのでしょうか?
ええと、「関数自体」の意味が今一つ分からないのですが、 レポート課題(10)で作成する際に減衰していく波形データを作るという意味であれば、 できます。試してみて下さい。
授業中でも説明があったかもしれないがバイナリファイルとは一体何者なのかと思い調べてみた所 「テキストファイル以外ほぼ全て」 「制御コードなどを埋め込む事ができるためテキストエディタではまともに読む事ができない」 などの特徴があることがわかった。 つまりはPC上の画像ファイルやオフィスの文書ファイルなどは全てバイナリファイルと呼ぶことが出来るのだと考えられる ただ、調べているときに書いてあったのは、主に自分の使用しているPC上にファイルを読むためのソフトウェアが無い場合にそのファイルが何かがよくわからないためにバイナリファイルと呼ぶことがおおいらしいということがわかった。
色々と自分で調べたのはとてもよい事ですね。
sample-decay.wavのバイナリモードが長過ぎてはれなかったです。。
はらなくていいです。はるのやめて下さいね。
バイナリファイルとコミュニケーションをとれないのでバイナリファイルを開くのが辛いです。
バイナリファイルは基本ツンデレなので、初めはなかなかうまくいかないものです。
バイナリを見ているとニヤつきがおさまりません。
周りに人がいるときには控えましょうね。
for文での式を"a[i]=(short)(a[i]*((double)(i)/15999.0))"とすると、最初は音量0で、 だんだん音量を大きくすることもできる。
良い考察ですね。 さらに係数を正弦関数などにして大きくなったり小さくなったりすることもできますね。
音波を表現するのに普通のdouble型の数値計算で出来るのがいまいち理解できない。.rawという拡張子(?)で入出力を行うと自動的に数値が音声になると考えていいのだろうか。
拡張子は全く関係ありません(要復習)。ファイルにはバイナリデータが格納されているだけです。soxというプレイヤーがそのバイナリデータをサウンドボードに送って、 サウンドボードはバイナリデータを電気信号に変えてスピーカに送って、 スピーカが電気信号を音波に変えています。
RAWファイルとDATファイルの違いがよくわからないのだが、RAWが音声ファイルでDATがテ キストファイルでいいのだろうか?
そのように解釈してもかまいませんが、拡張子の名前はあまり関係ありません。
プログラムを実行して音を出したら、パソコン室中に聞こえる爆音で「ピィィィーーーー!!」と鳴りました。 音量が17になってました。。。 2秒間心臓も呼吸も止まりました。 周りからの視線が痛かったです。
自業自得とはいえ大変でしたね(笑)。
Cをもう一度やり直したい、、、、(ポインタあたり)
復習、大事です。
出力と入力を使えるとおもしろい。
是非、何か面白い入出力プログラムに挑戦してみてくださいね。
最近穴埋め問題ばかりで解答を作るのが大変です。
そこを何とか憤張ってください。
最近の課題はみんなで協力して考えないと答えが出なくなってきた。 大変だけど、友達のありがたみを感じます。
協力するのはいいことですね。
誰かが「ピーーー」と鳴らしてるのかと思ったら自分の耳鳴りでした。
確かに耳鳴りと間違うような音ですね。
家でLinuxを使いたいが、つかえない。
1.家のPCにインストールする。2.家のWindowsにVMWareをインストールしてそこにLinuxをインストールする。3.家のWindowsにSygwinをインストールする。4.SRASで大学のLinuxに接続する。 のいずれかになると思います。
あいかわらずてゆーかパソコンに向かう時間が増えたので肩こりが激しいです。
疲れてくると姿勢が悪くなって肩が上がってくるのでしょうね。 途中途中で休息時に席を立って仕切り直すのが良いと思います。
火曜日は1、2、3限の先生が尋常じゃなくノートを書かせるので疲れると同時に、とても イライラします。あの先生を何とかして欲しいです。
そのノートは将来の宝物になりますよ。 私も学生時代のノートひっくり返すこと今でもあります。
最近右手の指を3本やけどしてしまいました。とても熱かったです。痛熱かったです。お かげでペンとか箸を持つのがちょっと大変になりました。でも小指以外の指先は無事だったのでパソコンのタイピングには支障はなかったのでよかったです。
大変でしたね。右手なのがイタかったですね。
風邪引きました。辛いです。
休息第一ですね。
最近くしゃみがとまりません。
つ「マスク」
先週風邪を引いてしまい39.5度の熱が出ました。
過去形ってことは治ったんですね。よかったよかった。
風邪ぜんぜんよくなりません。
完治するまで油断しない方が良いですね。
サッカー選手のKANAZAWAさんがKANZAWAさんに見えて焦りました。 疲れがたまってるのかなぁ?
お疲れ様です。
体が重いです。でも今から5限の基底の再履がんばります。
がんばってくださいね。先日は大宮バックとか云いましたが、 実は退学勧告懸かってるんですね。何としても!
遅刻をしてしまいました。パ〜フェクトでエレガントな言い訳を教えてください。
以前にも似た質問があったような気が。
課題をやるにあたって、家にインターネットが繋がってないのが今とてもツライデス。。 。 どこか安く繋げるところ知ってますか?
家にネットワーク環境がないのは辛いですね。 プロバイダ料金はどこもあまり変わりないと思ってるのですが、 試しに周りの友人に聞いてみてはどうですか。
この C言語でバイナリを調整して音を減衰させるという作業は実際に行われている場はあ るのだろうか? 実際の仕事としてのプログラミングにこの作業が登場するとは想像しがたいのだが
音声ファイルを扱う仕事につかなければその機会はまずないでしょうね。 音声ファイルを扱う仕事であっても職場で採用されている言語がCでなければやはりその機会はないでしょうね。
最近もの忘れがひどいです。
それを覚えていればまずはひと安心。
実は最近、夜型に変わりました。 もう直しようがないです。
あららぁ。 頑張って朝まで起き続けるしかないですね。
最近朝起きれなくなりました。 この授業が4限で本当に良かったです。
ん?1限にも出ましょうね。
幸せな奴見てると、ムカつきませんか?
うーん、相手が幸せだとムカつくってことはないかなぁ。 その幸せを周りにひけらかされるとその無神経さにムカつくね。
昨日、ガンバ大阪がトヨタ・クラブW杯で1勝をあげた!次はとうとうマン チェスターUと対決です。自分はジュビロファンであるが今回はガンバ大阪を応援したい と思います。
残念ながらサッカーを含めたスポーツは全く分からないのですが、 ガンバ大阪が勝つといいですね。
誰もが予想しなかった今年のJリーグの大分トリニータの快進撃には感動させられました。どんなスポーツも地域密着で頑張っているチームは応援したくなります。
大分出身なのですか。関鯵、関鯖が有名ですね。
最近週5で鍋食べてます。 さすがに段々あきてきたのですが、何かオススメの味はありますか?
週5食べてるなら、もうないと思うのですが、 私は魚のあら煮出汁が好きです。
昨日、新木場まで行ってきました。遠かったです。
乗り換えていかないといけないのが大変ですね。
昨日新木場までライブを見に行ってきました
アゲハですか。
ミスド最高です
クリスピークリームはどうなんすかね。食ったことないけど。
僕は年越しそばは確実にどん兵衛派です。
緑のたぬきはダメですか。
昨日TDSに行っていきました。
まだ行ったことないんですよね。TDLと違って酒が飲めるんでしたっけ。
月曜日の深夜テレ朝でやってる「リーダー's ハゥ トゥ Book」という番組はとても面白いのでぜひ見てみてください。普段の生活においてとても役に立つことばっかりです。
トキオのリーダーがやってるやつですか?ならば見た事があるような。 月曜日はこの授業の準備でなかなかテレビ見る余裕がないんすよ。
自分はお笑い番組をそんなに見ないのでこの頃コメント欄に載っている芸人がほとんど誰か分かりません。エドはるみさんを「江戸春美」なる風変わりな演歌歌手だとばかり思っていた時期がありました。
私は最近まで玉木宏と玉置宏を混同してました。
最近の女子アナは、とてもかわいい人が多いと思います。先生は好きなアナウンサーとか 気になってるアナウンサーはいますか?
基本的にはいわゆる女子アナは苦手です。 でも、テレ東・大江はモヤさまでファンになりました。
今年の12月の札幌では雪は積もったり溶けたり(・ジ・ン・・ー)の繰り返しであまり12月らしくない、と地元の女の子が言っていました。
札幌が地元なんていいですね。
部屋の中の寒さは北海道以上だと思う。
そりゃあ、北海道の部屋の中は暖房ガンガンですから。
忘年会シーズンですがお金がないのでいけるかどうか不安です。
独りの時に質素にして人と過ごすときにはお金の心配をしないようにしたいですね。
自分に投資してみましたが、どうやらハメを外しすぎたみたいです。 今の手持ちが空っぽ状態になりました。
投資は計画的にね。
正月実家かえるのですが、新幹線で3時間かかります。ゲームや昼寝しても2時間が限界です。 なにかいい暇つぶしありませんか?
3時間だったらあっと云う間な気がしますが。 本を読むのはどうですか。 乗り過ごさないように気を付けてくださいね。
今年の年末は幕張で過ごします。
誰かのカウントダウンですか。いいですね。
今年の大晦日は何をしてすごしますか?自分は家でのんびりと『ガキの使いやあらへんで』を見る予定です。
ガキツカって特番すか。懐かしいですね。 大晦日はさすがに家でのんびりしたいなぁ。 ホントはDynamite見たいけどカミさんが許さぬであろう...。
山下達郎の「クリスマスイヴ」が心に浸みてたまりません。もう、涙が出そうです。
浸みる心がある内に。流れる涙がある内に。 その内、心は固くなって涙も枯れてしまうのですから。
神澤は朝起きるときに、必ず決まった掛け声を上げられると聞き及びました。それはど ういったものなのでしょうか?
そのむちゃぶり、どうなのよ。

何かありましたら、 まで。