输出实现的问题“迭代 FFT DIT Radix2”算法 matlab

问题描述

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

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

这是我实现的(其中一个)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 

这是输出

Amplitude-Frequency Plot

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

我一开始以为是频率归一化问题,但没有解决

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

重新编辑:

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

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

解决方法

1.- Welch 已经是 Spectrum Analyzer 模块中使用的默认窗口。

https://uk.mathworks.com/help/dsp/ref/spbscopes.spectrumanalyzerconfiguration.html#btr7s99-1_sep_mw_2f96bfab-faf1-44c2-952f-d7fe5303d73b

你为什么要重新编写已经实现的内容?

2.- 还有用于频谱估计的命令 pwelch

https://uk.mathworks.com/help/signal/ug/welch-spectrum-estimates.html?searchHighlight=welch&s_tid=srchtitle

https://uk.mathworks.com/help/signal/ref/pwelch.html?searchHighlight=welch.m&s_tid=srchtitle

3.- 直接焊接

4.- 也读这个

https://uk.mathworks.com/support/search.html/answers/18485-fft-spectrum-or-welch-spectrum.html?fq[]=asset_type_name:answer&fq[]=category:signal/nonparametric-spectral-estimation&page=1

5.- 还有这些 2

https://uk.mathworks.com/matlabcentral/fileexchange/53464-welch-s-cross-power-spectral-density?s_tid=srchtitle

https://uk.mathworks.com/matlabcentral/fileexchange/34383-calculate-psd-of-a-signal-using-welch-algorithm?s_tid=srchtitle