以下はwaveサウンドのプログラムです。
len=SRATE/F; //波長
for(i=0;i<SRATE*2;i++){ //波形データ作成
if(i%len < len/2) lpWave[i]=128+64;
else lpWave[i]=128-64;
}
lenは, 1波長でどれだけサンプル数があるか ですよね?
i%len len/2 というのは何をやっているのでしょうか?
教えてください。
#define SRATE 8000 //標本化周波数(1秒間のサンプル数)
#define F 400 //周波数(1秒間の波形数)
LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
WAVEFORMATEX wfe;
static HWAVEOUT hWaveOut;
static WAVEHDR whdr;
static LPBYTE lpWave;
int i,len;
switch(uMsg){
case WM_CREATE:
wfe.wFormatTag =WAVE_FORMAT_PCM;
wfe.nChannels =1;
wfe.wBitsPerSample =8;
wfe.nBlockAlign =wfe.nChannels * wfe.wBitsPerSample/8;
wfe.nSamplesPerSec =SRATE;
wfe.nAvgBytesPerSec =wfe.nSamplesPerSec * wfe.nBlockAlign;
waveOutOpen(&hWaveOut,WAVE_MAPPER,&wfe,
hWnd,0,CALLBACK_WINDOW);
lpWave=(LPBYTE)calloc(wfe.nAvgBytesPerSec,2); //2秒分
len=SRATE/F; //波長
for(i=0;i<SRATE*2;i++){ //波形データ作成
if(i%len < len/2) lpWave[i]=128+64;
else lpWave[i]=128-64;
}
1波長の半分を高く/半分を低くしてんでしょ。
矩形波を作ってんじゃないかしら。
>lenは, 1波長でどれだけサンプル数があるか ですよね?
波長は山と山の距離のことだから1波長って数えるかどうか知らないが
それであっていると思う。
>i%len len/2 というのは何をやっているのでしょうか?
i%lenは、整数でi÷lenを計算したときのあまりのこと。
for(i=0;i<SRATE*2;i++)のiそのままでは、
波1個のサンプル数を超えてしまう。
波形を作成する計算にiそのままでは使えない。
len/2は、波の半分でありifで使用しているから
左半分と右半分で処理を分けていると想像できる。
俺だったらwaveファイルをグラフに表示してプログラムの動作確認する。
waveファイルをグラフに表示するツールを持っていないなら
以下のようにすれば判るよ。
for(i=0;i<SRATE*2;i++){ //波形データ作成
if(i%len < len/2) lpWave[i]=128+64;
else lpWave[i]=128-64;
printf(%8d\t%8d\t%8d\n,i,i%len,lpWave[i]);
}
回答どうもありがとうございます。
物理的な知識がまずしっかりしてないとダメみたいですね。
>1波長の半分を高く/半分を低くしてんでしょ。
>矩形波を作ってんじゃないかしら。
イメージがつかめましたどうもです。
>俺だったらwaveファイルをグラフに表示してプログラムの動作確認する。
>waveファイルをグラフに表示するツールを持っていないなら
>以下のようにすれば判るよ。
これは新しい発見でしたありがとうございます。
みなさん,ありがとうございました。