汉明窗产生一条线

时间:2013-03-01 14:12:01

标签: c# audio naudio hamming-window

我有一个音频文件并从声卡缓冲区中读取所有数据。然后,我将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
}

2 个答案:

答案 0 :(得分:2)

看起来你正在将窗口应用于整个wave,因此read将会很大,因此cos内的术语总是非常接近0 {{1在[-1,1]之间。

因此,您始终获得data = .54 - .46*cos(0) = .54 - .46*1.0

wikipedia开始,只有.08应位于余弦内 - 这会给出窗口,然后乘以j

data[j]

你为什么试图在整个波浪中使用汉明窗?

答案 1 :(得分:1)

我认为你的汉明线是错误的:

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

当你的循环从0转到read/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
}