自己的代码,循环向量形式的表单

2视图(30天)
你好,我有自己的代码来获得fft,向量x对应一个信号在时域输入,和fft回报我,该函数使用循环,我需要相同的功能但是没有循环,也就是说,转化的循环向量或矩阵的迭代器。我试图以不同的方式,但我没有成功。有人能帮助我吗?
的代码如下:
这从基数2 fft代码方法。
函数[y] = my_fft_for (x)
N1 =长度(x);%计算Xn序列的大小
nFFT = 2 ^装天花板(log2 (N1));%计算样本的数量才能完成
x = [x 0 (nFFT-N1)];%完成序列与0 nFFT元素
N =长度(x);%计算xn样品的数量
b = bin2dec (fliplr (dec2bin (0:1: nFFT-1))) + 1;%重新排序的样本(逆位)
x = x (b);%信号重新排序
S = log2 (N);%计算阶段的数量
半= 1;%初始化与价值的一半
= 1阶段:S%的FOR循环阶段的算法Log2 (N)
指数= 0(2 ^阶段):(n - 1)%的蝴蝶为每个阶段算法
n = 0 (Half-1):%蝴蝶计算和结果保存
pos = n +指数+ 1;%指数样本
战俘= (2 ^ (S-stage)) * n;%的复杂的乘法
w = exp((1) *(2 *π)*战俘/ N);%复杂乘法
x = x (pos) + (pos +一半)。* w;%的第一部分蝴蝶
b = x (pos) - x (pos +一半)。* w;%的第二部分的蝴蝶
x (pos) =一个;%保存结果的第一部分的蝴蝶
x (pos +一半)= b;%保存结果的第二部分的蝴蝶
结束
结束
= 2 *一半一半;%计算下一个“半”的价值
结束
y = x;%保存函数的结果
结束
我有这个测试:
clc,关闭所有、清晰所有
% %信号施工
%信号持续时间
时间= 1;
%的第一个频率分量
f1 = 10;
%的第二频率分量
f2 = 20;
%采样频率
Fs = 10 * f2;
%采样周期
Ts = 1 / f;
%向量的
t = 0: Ts:持续时间;
%信号施工
%原始信号没有(10)+ (20)
xn =罪(2 *π* f1 * t) +罪(2 *π* f2 * t);
% N1 =长度(xn); % xn计算序列的大小
%频域
%信号样本的数量
N =长度(xn);
%计算值最接近2乘以一个的倍数
%因素增加样本的数量和有一个更好的结果
nFFT = 2 ^(装天花板(log2 (N)));
% Xn2 = my_fft_vectorial (xn);
%我应用matlab FFT的函数
Xn1 = my_fft_for (xn);
%计算复合物称为周期图的模块
周期图= abs (Xn1);
%计算轴的频率:相同数量的点周期图和介于0和Fs:
f = linspace (0 f nFFT);
%的两个轴准备好了,我们只是图:
情节(f,周期图);
%由于中期对称,我们只是感兴趣的可视化的一半PERIDODOGRAM:
轴([0 f / 2 0马克斯(周期图)))
包含(“F (Hz)”)
标题(“基于Matlab FFT的周期图”)
注意:
我需要从循环形式变换向量形式类似于:
DFT循环形式
DFT变换矢量形式
请帮助!

接受的答案

萨尔曼·艾哈迈德
萨尔曼·艾哈迈德 2021年8月30日
嗨,斯大林,
我认为你需要所有的循环代码进行向量化。你可以参考一个可能的解决方案,减少两个循环的代码。很难降低第三循环不重写逻辑 指数 pos 变量大小改变迭代的迭代。希望它可以帮助。
函数[y] = my_fft_for (x)
N1 =长度(x);%计算Xn序列的大小
nFFT = 2 ^装天花板(log2 (N1));%计算样本的数量才能完成
x = [x 0 (nFFT-N1)];%完成序列与0 nFFT元素
N =长度(x);%计算xn样品的数量
b = bin2dec (fliplr (dec2bin (0:1: nFFT-1))) + 1;%重新排序的样本(逆位)
x = x (b);%信号重新排序
S = log2 (N);%计算阶段的数量
半= 1;
= 1阶段:S%的FOR循环阶段的算法Log2 (N)
指数= 0(2 ^阶段):(n - 1);%的蝴蝶为每个阶段算法
n = 0: (Half-1);%蝴蝶计算和结果保存
pos = n +指数”+ 1;%指数样本
战俘= (2 ^ (S-stage))。* n;%的复杂的乘法
w = exp((1) *(2 *π)。*战俘/ N);%复杂乘法
x = x (pos) + (pos +一半)。* w;%的第一部分蝴蝶
b = x (pos) - x (pos +一半)。* w;%的第二部分的蝴蝶
x (pos) =一个;%保存结果的第一部分的蝴蝶
x (pos +一半)= b;%保存结果的第二部分的蝴蝶
= 2 *一半一半;
结束%计算下一个“半”的价值
y = x;
%保存函数的结果
结束
1评论
斯大林加西亚Ruano
斯大林加西亚Ruano 2021年8月31日
由于男人,代码工作完美! !

登录置评。

更多的答案(0)

下载188bet金宝搏


释放

R2020a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!