0

オーディオ ファイルがあり、サウンド カード バッファからすべてのデータを読み取ります。次に、それらをハミング ウィンドウに使用するように変換byte[]します。float[]オーディオの波形は次のとおりです。

http://i.stack.imgur.com/2NhTB.png

ハミングウィンドウを使用した後:

http://i.stack.imgur.com/N87qE.png

ハミング窓を使ったオーディオの波形は正しいですか?私の間違いはどこですか?

ところで、私は音声を処理するためにnaudioライブラリを使用しています:

WaveChannel32 wave = new WaveChannel32(new WaveFileReader("sesDosyası.wav"));
byte []buffer = new byte[wave.length];
float []data = new float[wave.length / 4];
int read = wave.Read(buffer, 0, wave.length);
for (int i = 0; i < read / 4; i++)
{   
    data[i] = BitConverter.ToSingle(buffer, i * 4); //converting byte to float
    chart1.Series["wave"].Points.Add(data[i]); //first waveform
}

for (int j = 0; j < read/4; j++)
{
   data[j] = (float)(0.54 - 0.46 * Math.Cos((2 * Math.PI * data[j]) / (read / 4 - 1)));//hamming
   chart2.Series["wave"].Points.Add(data[j]); //second waveform
}
4

2 に答える 2

2

ウィンドウを波全体に適用しているようにread見えるので、巨大になるので、[-1,1]cosの間の項は常に 0 に非常に近くなります。data

したがって、常に.54 - .46*cos(0)= .54 - .46*1.0=を取得しています.08

ウィキペディアから、コサインの内側にのみjある必要があります-これにより、ウィンドウが得られ、次のように乗算されdata[j]ます。

window =  0.54 - 0.46 * Math.Cos( (2*Math.PI * j)/(total - 1) ).
hammed_signal = data[j]*window;

波全体にハミング ウィンドウを適用しようとしているのはなぜですか?

于 2013-03-01T15:06:52.863 に答える
1

私はあなたのハミングラインが間違っていると思います:

data[j] = (float)(0.54 - 0.46 * Math.Cos((2 * Math.PI * data[j]) / (read - 1)));

ループがから0になりread/4、で除算してreadいるため、16個のサンプルを読み取った場合、forループは最初の4個だけを調べ、3ではなく15で除算します。

var total = read / 4;

for (int j = 0; j < total; j++)
{
   data[j] = (float)(0.54 - 0.46 * Math.Cos((2 * Math.PI * data[j]) / (total- 1)));//hamming
   chart2.Series["wave"].Points.Add(data[j]); //second waveform
}
于 2013-03-01T14:52:45.857 に答える