waveサウンド

[戻る]
おじゃる 2007/06/05(火) 18:14:32
以下は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;
            }

επιστημη [HomePage] 2007/06/05(火) 19:45:17
1波長の半分を高く/半分を低くしてんでしょ。
矩形波を作ってんじゃないかしら。

wclrp ( 'o') [HomePage] 2007/06/06(水) 08:09:34
>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]);
}

おじゃる 2007/06/07(木) 19:33:53
[[解決]]
回答どうもありがとうございます。
物理的な知識がまずしっかりしてないとダメみたいですね。

>1波長の半分を高く/半分を低くしてんでしょ。
>矩形波を作ってんじゃないかしら。

イメージがつかめましたどうもです。


>俺だったらwaveファイルをグラフに表示してプログラムの動作確認する。
>waveファイルをグラフに表示するツールを持っていないなら
>以下のようにすれば判るよ。

これは新しい発見でしたありがとうございます。

みなさん,ありがとうございました。

古いスレッドには追加発言できません。