short
型1000個の配列を用意して,
そのi
番目の要素に,2*i
を設定して,
ファイルshort1000-1.datに出力するプログラムを作成して下さい.
report10-1.c |
---|
#include<stdio.h> #include<stdlib.h> int main(void){ FILE *fp; int chk, i; short a[1000]; for(i=0;i<1000;i++){ a[i]=2*i; } fp=fopen("short1000-1.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<sizeof(a)/sizeof(a[0])){ printf("Write Error(%d)\n", chk); } fclose(fp); return 0; } |
sox -V -r 8000 -s -w -c 1 sample.raw -t ossdsp /dev/dsp0 |
short
型1000個の配列を用意して,
その番目の要素に,を設定して,
ファイルshort1000-2.datに出力するプログラムを作成して下さい.
ただし,小数計算を明示するために、10,2を10.0,2.0と記述し、
関数sin
の引数にdouble
型を設定するために
i
をdouble
型に変換し,
計算結果をshort
型配列に格納するために
short
型に代入するための代入演算子の右辺全体を
short
型に型変換して下さい.
ここで例えば,double
型変数x
をint
型に型変換して,int
型変数n
に代入するには
double x=1.2; int n; n=(int)(x); |
report10-2-2.c |
---|
#include<stdio.h> #include<stdlib.h> #include<math.h> int main(void){ FILE *fp; int chk, i; short a[1000]; for(i=0;i<1000;i++){ a[i]=(short)(10.0*sin(2.0*(double)(i))); } fp=fopen("short1000-2.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<sizeof(a)/sizeof(a[0])){ printf("Write Error(%d)\n", chk); } fclose(fp); return 0; } |
report10-2-3.c |
---|
#include<stdio.h> #include<math.h> int main(void){ short a[16000]; int i; FILE *fp; fp=fopen("pcm-8000Hz-1c-2byte-1000Hz-2sec.raw", "wb"); for(i=0;i<16000;i++){ a[i]=(short)(32767.0*sin(2*M_PI*1000.0*((double)i)/8000.0)); } printf("%d %d\n", sizeof(a[0]), sizeof(a)); fwrite(a, sizeof(a[0]), sizeof(a)/sizeof(a[0]), fp); fclose(fp); return 0; } |
課題音声のピッチが(a)[Hz]ということは1秒間に(b)回振動することを表し, その周期は(c)[sec]となります.課題音声の振幅が(d)なので, その正弦波を時刻[sec]の関数とするとを用いて (e)と表されます.
課題音声のサンプリングレートが(f)[Hz]ということは,
1秒間に(g)個のデータを用いることになり,
課題では(h)[sec]の音声データが必要なので,
課題音声のフォーマットである(i)[bit]符号付きデータを(j)個格納するための配列を用意することになります.
(i)[bit]は(k)バイトなので,(i)[bit]符号付きデータを表すために(l)型を用います.
したがって,(l)型を(j)個要素に持つ配列を用います.
ここで,その配列の名前をwave
とします.
課題音声のサンプリングレートが(f)[Hz]なので,
配列wave
の要素1つで(m)[sec]分のデータを保持することになります.
よって,配列wave
のi
番目の要素は
(n)秒目のデータを保持することになります.
したがって,先程得た正弦波の式を用いると
配列wave
のi
番目の要素の値は,
(o)と表されます.
ここで,C言語の型規則にしたがうために,正弦波の式中の整数は,
例えば2を2.0のように,double型
として認識されるように,
また,i
をdouble
型に型変換してから計算されるように,
さらに,配列の要素wave[i]
に代入する際に,
short
型に型変換してから代入して下さい.
また,円周率については,3.14としてもかまいませんが,
マクロ定数M_PI
を用いるとより正確に計算できます.
課題音声のピッチが(A:1)[kHz]ということは1秒間に(B:1000)回振動することを表すので、 振幅を仮にとすると、 その正弦波は時刻[sec]の関数として (C:)と表されます.
課題音声のサンプリングレートが(D:8000)[Hz]ということは,
1秒間に(E:8000)個のデータを用いることになり,
課題では(F:2)秒間の音声データが必要なので,
課題音声のフォーマットである(G:16)[bit]符号付きデータを(H:16000)個格納するための配列を用意することになります.
(G:16)[bit]は(I:2)バイトなので,(G:16)[bit]符号付きデータを表すために(J:short)型を用います.
したがって,(J:short)型を(H:16000)個要素に持つ配列を用います.
ここで,その配列の名前をwave
とします.
(J:short)型で表すことのできる最大値は(K:32767)なので、 先の正弦波の振幅は(K:32767)となります。
課題音声のサンプリングレートが(D:8000)[Hz]なので,
配列wave
の要素1つで(L:1/8000)[sec]分のデータを保持することになります.
よって,配列wave
のi
番目の要素は
(M:i/8000)秒目のデータを表すことになります.
したがって,先程得た正弦波の式を用いると
配列wave
のi
番目の要素の値は,
(N:)と表されます.