昨晚分享了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')
这种方法其实看起来效果不太好,理论上可以,难得在于得到相位信息,如果得到准确的相位信息,则结果如下图,完美拟合上。