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)));

随着您的循环从0read/4,并且您正在除以read,因此如果您已阅读 16 个样本,则您的 for 循环仅查看前 4 个,但除以 15,而不是 3。

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 回答