C 实现Hann窗口

C 实现Hann窗口,c,signal-processing,fft,fftw,C,Signal Processing,Fft,Fftw,我将接收到的数据块通过fftw获得一些光谱信息。一切似乎都正常,但我认为我遇到了一些别名问题 我一直在努力研究如何在我的数据块上实现hann窗口。谷歌的例子让我失望。有什么想法或链接我应该看看 double dataIn[2048] > /* windowing here? */ > FFT > double freqBins[2048] 更新 感谢奥利指出我实际上要解决的问题是频谱泄漏,而不是混叠…维基百科是你的朋友: 你的谷歌搜索结果一定是维基百科?!无论如何,只需创建一

我将接收到的数据块通过fftw获得一些光谱信息。一切似乎都正常,但我认为我遇到了一些别名问题

我一直在努力研究如何在我的数据块上实现hann窗口。谷歌的例子让我失望。有什么想法或链接我应该看看

double dataIn[2048] > /* windowing here? */ > FFT > double freqBins[2048]
更新


感谢奥利指出我实际上要解决的问题是频谱泄漏,而不是混叠…

维基百科是你的朋友:

你的谷歌搜索结果一定是维基百科?!无论如何,只需创建一个函数,返回一个长度为N的数组和汉宁系数,并将该数组乘以[2048]中的
数据。实现非常直接地遵循定义。只需使用
w(n)
函数作为乘法器,循环遍历所有样本(在运行过程中更改
n
),即可

for (int i = 0; i < 2048; i++) {
    double multiplier = 0.5 * (1 - cos(2*PI*i/2047));
    dataOut[i] = multiplier * dataIn[i];
}
for(int i=0;i<2048;i++){
双乘数=0.5*(1-cos(2*PI*i/2047));
dataOut[i]=乘数*dataIn[i];
}

不是对你问题的回答,而是对你问题的旁白。窗口化有助于解决光谱泄漏问题,而不是混叠问题

当波形的频率分量不是采样率的整数倍或整数倍时,会发生频谱泄漏效应


如果你有别名,那你就完蛋了。您需要提高采样率,或者在采样之前加入(更好的)抗混叠过滤器。

可以找到与MATLAB等效的完整函数:

/*函数w=hanning(varargin)
%汉宁汉宁窗。
%HANNING(N)返回列中的N点对称HANNING窗口
%向量。请注意,第一个和最后一个零加权窗口采样
%不包括在内。
%
%汉宁(N,'symmetric')返回与汉宁(N)相同的结果。
%
%汉宁(N,'periodic')返回N点周期汉宁窗口,
%并包括第一个零加权窗口样本。
%
%注意:使用HANN函数可获得具有
%第一个和最后一个零加权样本。ep
itype=1-->周期性
itype=0-->对称
默认itype=0(对称)
版权所有1988-2004 MathWorks公司。
%$Revision:1.11.4.3$$日期:2007/12/14 15:05:04$
*/
浮点*汉宁(整数N,短itype)
{
int-half,i,idx,n;
浮动*w;
w=(浮动*)calloc(N,sizeof(浮动));
memset(w,0,N*sizeof(float));
if(itype==1)//周期函数
n=n-1;
其他的
n=n;
如果(n%2==0)
{
一半=n/2;

对于(i=0;i为什么不使用Math.NET的Hann窗口实现

double[] hannDoubles = MathNet.Numerics.Window.HannPeriodic(dataIn.Length);
for (int i = 0; i < dataIn.Length; i++)
{
    dataOut[i] = hannDoubles[i] * dataIn[i];
}
double[]hannDoubles=MathNet.Numerics.Window.hannperic(dataIn.Length);
for(int i=0;i

位于此处:

这很好,但大多数人可能希望在数千个充满数据的数组上执行此操作。您可以在程序初始化时填充一个只有常数乘法器的数组(使用与馈送到FFT相同大小的数组)然后将实数数组中的每一点乘以乘法器数组中的每一点。比每次重复所有余弦更快/更便宜

double[] hannDoubles = MathNet.Numerics.Window.HannPeriodic(dataIn.Length);
for (int i = 0; i < dataIn.Length; i++)
{
    dataOut[i] = hannDoubles[i] * dataIn[i];
}