首页 > 解决方案 > 执行“迭代 FFT DIT Radix2”算法 matlab 的输出问题

问题描述

我正在尝试使用迭代 Radix2 算法实现我自己的 FFT (我什至考虑过使用递归算法,但似乎 Simulink 不允许我这样做)。我尝试了它的所有可能变体,例如 DIT 和 DIF,但我总是遇到同样的问题:输出对我来说没有多大意义。它们具有相似的输出,包括 DIF 和 DIT,这两种都是用不同的代码变体实现的。

在实际应用中需要这种算法,信号将被缓冲,然后这些数据包被窗口化并重叠。然后,窗口函数将被平均并发送到 Simulink 中的下一个模块,以获得Welch Spectral 估计

这是我实现的(其中一个)DIT 版本的代码:

function [FFT,Wk,k] = radix2(u,k_old,lap) %lap = 512 = 1024/2 with 1024 Window size

N = length(u);
P = log2(N);
FFT = zeros(N,1)+0*1j;
omega = 0j;

% Hann Window
n1 = (k_old)*lap:(N+k_old*lap-1);
w1 = sin(pi.*n1/(N-1)).^2;
z1 = u.*w1';
z1=z1';

% Average
Wk = 0;
for i=1:N
    Wk = Wk + w1(i)^2;
end

%% Algorithm
A = z1(bitrevorder(1:N));
for s=1:log2(N)
    m=2^s;
    Wm = exp(2*pi*1j/m)
    W = 1 +0j;
    for j= 1:m/2
        for k=j:m:(N)
            odd = W*A(k+m/2)
            even = A(k);
            FFT(k)=odd + even;
            FFT(k+m/2) =even-odd;
        end
        W = W*Wm;
    end
end 

这是输出

幅频图

而不是有两个/三个不同的尖峰(输入是一个带有一些噪声的正弦信号,即使我关闭噪声或窗口函数,结果也没有太大变化,所以这些是正确的),我得到了这个蝴蝶-整形信号。为什么会这样?

我首先认为这是一个频率归一化问题,但它并没有解决它。

我真的希望任何人都可以提供帮助,并且这个问题不是太愚蠢,我现在完全迷路了。

重新编辑:

原因是我在动态参数估计的不同技术之间进行并行处理:锁定放大器、带 DFT 的 Welch、FFT、Goertzel 和其他方法。然后我比较方差、时间、FLOPS……所以自我实现它正是我工作的重点。我知道 welch 已经存在于 Matlab 和 Simulink 中,但对于我的特殊研究目的,它并没有给我带来任何好处。此外,我的大多数版本都可以正常工作,唯一的一个问题是迭代 FFT实现,它看起来不像傅立叶变换,我真的不明白为什么。

输出应在 + 和 -50Hz 处显示两个尖峰,一个在 0Hz,因为信号的比例项和其他一些较小的周围,与 +-50Hz 和 0 相比微不足道。

标签: matlabfftsimulinkspectrumradix-sort

解决方案



推荐阅读