matlab - 执行“迭代 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 相比微不足道。
解决方案
1.- Welch 已经是 Spectrum Analyzer 模块中使用的默认窗口。
为什么要重新编写已经实现的内容?
2.- 还有用于频谱估计的命令 pwelch
https://uk.mathworks.com/help/signal/ref/pwelch.html?searchHighlight=welch.m&s_tid=srchtitle
3.-直接和welch
4.- 也读这个
5.- 还有这 2 个
推荐阅读
- python - 如何将扩展名为 .sqlt 的文件连接到 python?
- django - 视图糖尿病.views.signupuser 没有返回 HttpResponse 对象。它返回 None 而不是
- java - Java 模拟类方法和注入服务
- angular - 索赔过滤器,带角度和弹簧护套
- scala - Gatling:如何从 JSON 馈送文件加载范围?
- python - seaborn.catplot 在更改 x 和 y 的值时出现 ValueError
- python - 在 Heroku 上找不到 torch==1.5.0+cpu 的匹配分布
- java - 虽然循环不适用于名称长度验证(java)
- python - Python读取带有汉字的xml文件
- ios - 在其他函数中访问 tableview 的属性