我有一个音频文件并从声卡缓冲区中读取所有数据。然后,我将byte[]
转换为float[]
以将其用于汉明窗口。音频的波形是:
使用汉明窗后:
是汉明窗口的音频波形吗?我的错误在哪里?
顺便说一句,我使用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
}
答案 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
}