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 |
short型1000個の配列を用意して,
その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:)と表されます.