前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Matlab实现快速傅里叶逆变换

Matlab实现快速傅里叶逆变换

作者头像
用户9925864
发布2022-07-27 08:55:40
7180
发布2022-07-27 08:55:40
举报
文章被收录于专栏:算法工程师的学习日志

昨晚分享了matlab的快速傅里叶变换,应群友要求,分享一下快速傅里叶逆变换

昨晚文章:Matlab实现傅里叶变换

Matlab实现快速傅里叶逆变换通过ifft函数。


语法

X = ifft(Y) X = ifft(Y,n) X = ifft(Y,n,dim) X = ifft(___,symflag)


说明

X = ifft(Y) 使用快速傅里叶变换算法计算 Y 的逆离散傅里叶变换。X 与 Y 的大小相同。

  • 如果 Y 是向量,则 ifft(Y) 返回该向量的逆变换。
  • 如果Y 是矩阵,则 ifft(Y) 返回该矩阵每一列的逆变换。
  • 如果 Y 是多维数组,则 ifft(Y) 将大小不等于 1 的第一个维度上的值视为向量,并返回每个向量的逆变换。

X = ifft(Y,n) 通过用尾随零填充 Y 以达到长度 n,返回 Y 的 n 点傅里叶逆变换。

X = ifft(Y,n,dim) 返回沿维度 dim 的傅里叶逆变换。例如,如果 Y 是矩阵,则 ifft(Y,n,2) 返回每一行的 n 点逆变换。

X = ifft(___,symflag) 指定 Y 的对称性。例如,ifft(Y,'symmetric') 将 Y 视为共轭对称。

示例

向量的逆变换,时空采样数据与频率采样数据间的傅里叶变换及其逆变换。

创建一个向量并计算其傅里叶变换。

代码语言:javascript
复制
X = [1 2 3 4 5];
Y = fft(X)
Y = 1×5 complex

  15.0000 + 0.0000i  -2.5000 + 3.4410i  -2.5000 + 0.8123i  -2.5000 - 0.8123i  -2.5000 - 3.4410i
代码语言:javascript
复制
计算 Y 的逆变换,结果与原始向量 X 相同。
代码语言:javascript
复制
ifft(Y)
ans = 1×5

     1     2     3     4     5

多写几句,基于傅里叶结果来重构信号,基本思想是通过傅里叶变换得到的主频幅值和相位得到正弦信号,并叠加重构。

代码语言:javascript
复制
Fs = 1000;            % Sampling frequency                    
T = 1/Fs;             % Sampling period       
L = 1500;             % Length of signal
t = (0:L-1)*T;        % Time vector

构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦量和幅值为 1 的 120 Hz 正弦量。

代码语言:javascript
复制
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
代码语言:javascript
复制
plot(1000*t(1:50),S(1:50))
xlabel('t (milliseconds)')
ylabel('X(t)')
代码语言:javascript
复制
Y = fft(S);
f = Fs*(0:(L/2))/L;
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

plot(f,P1) 
title('Single-Sided Amplitude Spectrum of S(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')
代码语言:javascript
复制
ph=angle(Y(1:L/2));
ph=ph*180/pi;
figure
plot(f(1:L/2),ph(1:L/2));
xlabel('频率/hz'),ylabel('相角'),title('相位谱');
grid on;
代码语言:javascript
复制
[pks,locs] = findpeaks(P1);
[b,index] = sort(pks);
num = 1;
amp = b(end-num:end)
fre = f(locs(index(end-num:end)))
deg = ph((index(end-num:end)))
S1 = zeros(1,L);
for i = 1:length(amp)
    S1 = S1 + amp(i)*sin(2*pi*fre(i)*t+abs(deg(i))/180*pi);
end
figure
plot(t,S,'b',t,S1,'r')

这种方法其实看起来效果不太好,理论上可以,难得在于得到相位信息,如果得到准确的相位信息,则结果如下图,完美拟合上。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师的学习日志 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 语法
  • 说明
  • 示例
    • 向量的逆变换,时空采样数据与频率采样数据间的傅里叶变换及其逆变换。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档