我正在尝试用迭代Radix2算法实现自己的快速傅立叶变换(我甚至考虑使用递归算法,但似乎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 这是输出

而不是有两个/三个不同的尖峰(输入是一个带有噪声的窦性信号,即使我关掉噪声或窗口函数,结果也不会有太大变化,所以这些都是正确的),我得到了这个蝴蝶状信号。为什么看起来像那样?
我最初认为这是一个频率正常化问题,但它并没有解决这个问题。
我真的希望任何人都能帮忙,这个问题并不是太愚蠢,我现在完全迷失了方向。
重新编辑:
这是因为我在动态参数估计的不同技术之间做了并行处理:锁定放大器,Welch与DFT,FFT,Goertzel等方法。然后我比较变化,时间,失败.所以自我实现正是我工作的重点。我知道韦尔奇已经存在于Matlab和Simulink中,但它并没有给我带来特殊的研究目的。而且,我的大多数版本都工作得很好,唯一的问题是迭代FFT‘实现,它看起来不像傅里叶变换,我也不太明白原因。
输出应该显示两个峰值在+和-50赫兹,一个在0Hz,因为一个比例项的信号和其他较小的周围,不超过+-50赫兹和0赫兹。
发布于 2021-07-31 22:04:35
1.- Welch已经是频谱分析器块中使用的默认窗口。
为什么要再写一遍已经实现的内容?
2.-还有用于谱估计的命令
https://uk.mathworks.com/help/signal/ref/pwelch.html?searchHighlight=welch.m&s_tid=srchtitle
3.-直接和韦尔奇
4.-也读一下
5.-而这2
https://stackoverflow.com/questions/68594583
复制相似问题