MATLAB中的快速傅里叶变换
快速傅立叶变换是一种计算任何信号或矢量的离散傅立叶变换的算法。这是通过将信号分解成离散的频率来实现的。我们将不讨论其数学背景,因为这不在本文的范围之内。MATLAB提供了一个内置函数来计算信号的快速傅里叶变换,即FFT函数。
语法:
A = fft(X, n, dim)
其中A存储的是信号X的离散傅里叶变换(DFT),它可以是一个矢量、矩阵或多维数组。n指定X的n点DFT,如果没有指定,则是X的所有点。
让我们看看矢量的实践,因为它们是更实用的信号处理方式。我们将计算一个被一些随机误差破坏的假正弦波的DFT。
示例 1:
% MATLAB code for
% Defining axes for multiple plots
ax1 = axes('Position',[0.1 0.1 0.45 0.45]);
ax2=axes('Position',[0.6 0.6 0.35 0.35]);
% Defining signal
freq = 23; %freq
afreq = 2*pi*freq; %angular frequency
amp = 0.23; %amplitude
phase = pi/4; %phase angle
% Time vector
T = linspace(-pi,pi,100);
% Creating signal
signal = amp*sin((afreq * T) + phase);
% Adding random error in signal
signal = signal + 0.23*random(size(T));
% Plotting original signal in axes 1
plot(ax1,T,signal),title(ax1,"Original signal")
%computing DFT using Fast Fourier Transform
y=fft(signal);
%plotting transformed signal in axes 2
plot(ax2,T,y),title(ax2,"FFT signal")
输出:
随机正弦波信号的FFT
让我们再举一个例子,我们将用FFT计算一个矩形脉冲的DFT。
示例 2:
% MATLAB code for
% Defining the pulse
x=linspace(-2.5,2.5,300);
y=rectpuls(x,1);
% Computing the DFT using FFT
k=fft(y);
% Defining axes for multiple plots
ax1=axes('Position',[0.03 0.03 0.3 0.3]);
ax2=axes('Position',[0.39 0.39 0.5 0.5]);
% Plotting original pulse
plot(ax1,x,y)
axis(ax1,[-1 1 -0.1 1.23]),title(ax1,"Rectangular pulse")
% Plotting the DFT of the rectangular pulse
plot(ax2,x,k)
axis(ax2,[-1 1 -.9 .9]),title(ax2,"DFT of rectangular pulse")
输出:
现在,我们将对一个矩阵进行快速傅里叶变换。
示例 3:
% MATLAB code for creating a
% matrix of exponential of random numbers
mat = exprnd(1,3);
% Calculating its DFT using FFT entire matrix
fft_mat_entire = fft(mat);
% Calculating its DFT using FFT dimension 1
fft_mat_dim1 = fft(mat,[],1);
% Calculating its DFT using FFT dimension 2
fft_mat_dim2 = fft(mat,[],2);
输出:
输出将在三种情况下给我们提供傅里叶变换。
1.沿着整个矩阵进行FFT。
2.沿着维度1的FFT
3.沿着维度2的FFT