C# 汉明窗口生成一条直线

C# 汉明窗口生成一条直线,c#,audio,naudio,hamming-window,C#,Audio,Naudio,Hamming Window,我有一个音频文件,从声卡缓冲区读取所有数据。然后,我将byte[]转换为float[]以将它们用于汉明窗口。音频的波形为: 使用汉明窗口后: 汉明窗口的音频波形正确吗?我的错在哪里 顺便说一下,我使用naudio library处理音频: WaveChannel32 wave = new WaveChannel32(new WaveFileReader("sesDosyası.wav")); byte []buffer = new byte[wave.length]; float []dat

我有一个音频文件,从声卡缓冲区读取所有数据。然后,我将
byte[]
转换为
float[]
以将它们用于汉明窗口。音频的波形为:

使用汉明窗口后:

汉明窗口的音频波形正确吗?我的错在哪里

顺便说一下,我使用naudio library处理音频:

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
}
WaveChannel32 wave=新的WaveChannel32(新的波形阅读器(“sesDosyası.wav”);
字节[]缓冲区=新字节[波长];
浮动[]数据=新浮动[波长/4];
int read=wave.read(缓冲区,0,波长);
对于(int i=0;i
我认为你的汉明线错了:

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
}
var-total=read/4;
对于(int j=0;j
我认为你的汉明线错了:

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
}
var-total=read/4;
对于(int j=0;j
您似乎正在将窗口应用于整个波,因此
读取将是巨大的,因此
cos
中的术语对于[-1,1]之间的
数据
总是非常接近0

所以你总是得到
.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;

你为什么要尝试将汉明窗口应用于整个波?

你似乎要将该窗口应用于整个波,因此
read
将是巨大的,因此
cos
中的术语对于[-1,1]之间的
数据
总是非常接近0

所以你总是得到
.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;

你为什么要把汉明窗应用于整个波浪?

我的积木大小应该是多少?我的意思是,如果用4096字节数组块读取数据,它会被解决吗?如果你用
j
替换
data[j]
,你会得到正确的窗口。正确的块大小取决于您想要做什么。我通过16字节数组读取音频数据,并转换浮点数组。我对每个数据块使用汉明,它生成:ok ok nevermind i know。。我必须用你的密码。非常感谢你!我还有最后一个问题。当我使用“n”字节数组块读取数据时,汉明波形是这样的;n=16=>n=4096=>和n=16384=>我的区块大小应该是多少?除非你告诉我们你为什么要使用hamming,否则没人能告诉你应该使用什么区块大小?你们想要达到什么样的音频效果?我的区块大小应该是多少?我的意思是,如果用4096字节数组块读取数据,它会被解决吗?如果你用
j
替换
data[j]
,你会得到正确的窗口。正确的块大小取决于您想要做什么。我通过16字节数组读取音频数据,并转换浮点数组。我对每个数据块使用汉明,它生成:ok ok nevermind i know。。我必须用你的密码。非常感谢你!我还有最后一个问题。当我使用“n”字节数组块读取数据时,汉明波形是这样的;n=16=>n=4096=>和n=16384=>我的区块大小应该是多少?除非你告诉我们你为什么要使用hamming,否则没人能告诉你应该使用什么区块大小?你想达到什么样的音频效果?