- Matlab 教程
- MATLAB - 首页
- MATLAB - 概述
- MATLAB - 特性
- MATLAB - 环境设置
- MATLAB - 编辑器
- MATLAB - 在线版
- MATLAB - 工作区
- MATLAB - 语法
- MATLAB - 变量
- MATLAB - 命令
- MATLAB - 数据类型
- MATLAB - 运算符
- MATLAB - 日期和时间
- MATLAB - 数字
- MATLAB - 随机数
- MATLAB - 字符串和字符
- MATLAB - 文本格式化
- MATLAB - 时间表
- MATLAB - M 文件
- MATLAB - 冒号表示法
- MATLAB - 数据导入
- MATLAB - 数据导出
- MATLAB - 数据归一化
- MATLAB - 预定义变量
- MATLAB - 决策
- MATLAB - 决策语句
- MATLAB - if-end 语句
- MATLAB - if-else 语句
- MATLAB - if-elseif-else 语句
- MATLAB - 嵌套 if 语句
- MATLAB - switch 语句
- MATLAB - 嵌套 switch
- MATLAB - 循环
- MATLAB - 循环
- MATLAB - for 循环
- MATLAB - while 循环
- MATLAB - 嵌套循环
- MATLAB - break 语句
- MATLAB - continue 语句
- MATLAB - end 语句
- MATLAB - 数组
- MATLAB - 数组
- MATLAB - 向量
- MATLAB - 转置运算符
- MATLAB - 数组索引
- MATLAB - 多维数组
- MATLAB - 兼容数组
- MATLAB - 分类数组
- MATLAB - 元胞数组
- MATLAB - 矩阵
- MATLAB - 稀疏矩阵
- MATLAB - 表格
- MATLAB - 结构体
- MATLAB - 数组乘法
- MATLAB - 数组除法
- MATLAB - 数组函数
- MATLAB - 函数
- MATLAB - 函数
- MATLAB - 函数参数
- MATLAB - 匿名函数
- MATLAB - 嵌套函数
- MATLAB - return 语句
- MATLAB - 无返回值函数
- MATLAB - 局部函数
- MATLAB - 全局变量
- MATLAB - 函数句柄
- MATLAB - 滤波器函数
- MATLAB - 阶乘
- MATLAB - 私有函数
- MATLAB - 子函数
- MATLAB - 递归函数
- MATLAB - 函数优先级
- MATLAB - map 函数
- MATLAB - mean 函数
- MATLAB - end 函数
- MATLAB - 错误处理
- MATLAB - 错误处理
- MATLAB - try...catch 语句
- MATLAB - 调试
- MATLAB - 绘图
- MATLAB - 绘图
- MATLAB - 绘制数组
- MATLAB - 绘制向量
- MATLAB - 条形图
- MATLAB - 直方图
- MATLAB - 图形
- MATLAB - 二维线图
- MATLAB - 三维图
- MATLAB - 图表格式化
- MATLAB - 对数坐标图
- MATLAB - 绘制误差条
- MATLAB - 绘制三维等高线图
- MATLAB - 极坐标图
- MATLAB - 散点图
- MATLAB - 绘制表达式或函数
- MATLAB - 绘制矩形
- MATLAB - 绘制频谱图
- MATLAB - 绘制网格曲面
- MATLAB - 绘制正弦波
- MATLAB - 插值
- MATLAB - 插值
- MATLAB - 线性插值
- MATLAB - 二维数组插值
- MATLAB - 三维数组插值
- MATLAB - 多项式
- MATLAB - 多项式
- MATLAB - 多项式加法
- MATLAB - 多项式乘法
- MATLAB - 多项式除法
- MATLAB - 多项式的导数
- MATLAB - 变换
- MATLAB - 变换函数
- MATLAB - 拉普拉斯变换
- MATLAB - 拉普拉斯滤波器
- MATLAB - 高斯-拉普拉斯滤波器
- MATLAB - 逆傅里叶变换
- MATLAB - 傅里叶变换
- MATLAB - 快速傅里叶变换
- MATLAB - 二维逆余弦变换
- MATLAB - 向坐标轴添加图例
- MATLAB - 面向对象
- MATLAB - 面向对象编程
- MATLAB - 类和对象
- MATLAB - 函数重载
- MATLAB - 运算符重载
- MATLAB - 用户自定义类
- MATLAB - 复制对象
- MATLAB - 代数
- MATLAB - 线性代数
- MATLAB - 高斯消元法
- MATLAB - 高斯-约当消元法
- MATLAB - 简化行阶梯形
- MATLAB - 特征值和特征向量
- MATLAB - 积分
- MATLAB - 积分
- MATLAB - 二重积分
- MATLAB - 梯形法则
- MATLAB - 辛普森法则
- MATLAB - 其他
- MATLAB - 微积分
- MATLAB - 微分
- MATLAB - 矩阵的逆
- MATLAB - GNU Octave
- MATLAB - Simulink
- MATLAB - 有用资源
- MATLAB - 快速指南
- MATLAB - 有用资源
- MATLAB - 讨论
MATLAB - 快速傅里叶变换
快速傅里叶变换 (FFT) 是一种广泛应用于信号处理和其他领域的数学算法,用于高效计算离散傅里叶变换 (DFT) 及其逆变换。DFT 将信号从其原始域(通常是时间或空间)转换为频域表示。
快速傅里叶变换相对于标准 DFT 的主要优势在于其速度。标准 DFT 算法的计算复杂度为 O(N^2),其中 N 是信号中的样本数,而 FFT 将其降低到 O(N log N),对于大型数据集而言速度快得多。
使用 Matlab 中的 fft() 函数进行快速傅里叶变换
MATLAB 中的 fft() 函数用于计算信号的快速傅里叶变换 (FFT)。它以表示时域信号的向量作为输入,并返回表示频域信号的向量。
语法
Y = fft(X) Y = fft(X,n) Y = fft(X,n,dim)
语法解释
Y = fft(X) − MATLAB 中的函数计算信号的傅里叶变换。如果提供向量,则计算该向量的变换。如果提供矩阵,则计算矩阵每一列的变换。对于多维数组,它将沿第一个非单一维度上的值视为向量,并计算每个向量的变换。
Y = fft(X,n) − MATLAB 中的 fft() 函数可以计算特定长度的傅里叶变换,称为 n 点 DFT。
如果提供的向量 X 短于 n,则会在 X 的末尾添加零,使其长度为 n。如果 X 长于 n,则会截断多余的值。
如果 X 是矩阵,则它将每一列视为向量进行处理。
对于多维数组,它将第一个非单一维度视为向量。
Y = fft(X,n,dim) − MATLAB 中的 fft() 函数可以沿矩阵或多维数组的特定维度计算傅里叶变换。例如,如果您有一个矩阵 X 并使用 fft(X,n,2),它将计算矩阵每一行的 n 点傅里叶变换。
让我们来看一些上面解释的语法的示例。
示例 1:可视化简单输入信号的傅里叶变换
我们的代码如下所示:
x = [0, 1, 0, -1]; Y = fft(x); % Plotting figure; subplot(2,1,1); stem(x); title('Input Signal'); xlabel('Time'); ylabel('Amplitude'); subplot(2,1,2); stem(abs(Y)); title('Magnitude of Fourier Transform'); xlabel('Frequency'); ylabel('Magnitude');
在这个示例中,我们有一个简单的输入信号 x,由向量 [0, 1, 0, -1] 表示。
fft(x) 函数使用快速傅里叶变换 (FFT) 算法计算输入信号 x 的离散傅里叶变换 (DFT)。结果存储在变量 Y 中。
计算傅里叶变换后,我们创建一个图形来绘制输入信号及其傅里叶变换以进行可视化。
在第一个子图 (subplot(2,1,1)) 中,我们使用 stem() 函数绘制时域中的输入信号 x。x 轴表示时间,y 轴表示信号的幅度。
在第二个子图 (subplot(2,1,2)) 中,我们使用 abs() 函数计算傅里叶变换 Y 的幅度,因为傅里叶变换可能具有复数值。然后我们使用 stem() 绘制傅里叶变换的幅度。这里,x 轴表示频率,y 轴表示傅里叶系数的幅度。
执行后的输出如下所示:
示例 2:使用矩阵进行快速傅里叶变换
我们的代码如下:
X = [1, 2, 3; 4, 5, 6; 7, 8, 9]; Y = fft(X); % Plotting figure; subplot(2,1,1); stem(X(:)); title('Input Matrix (Vectorized)'); xlabel('Index'); ylabel('Value'); subplot(2,1,2); stem(abs(Y(:))); title('Magnitude of Fourier Transform (Vectorized)'); xlabel('Frequency Index'); ylabel('Magnitude');
在这个示例中,第一个子图显示输入矩阵 X(向量化),其中矩阵元素沿 x 轴,其值在 y 轴上。第二个子图显示矩阵(向量化)的傅里叶变换 Y 的幅度,其中频率索引在 x 轴上,傅里叶系数的幅度在 y 轴上。
执行后的输出如下所示:
示例 3:使用语法 Y = fft(x,n) 进行快速傅里叶变换
我们的代码如下所示:
x = [0, 1, 0, -1]; n = 8; % Desired length of the Fourier transform Y = fft(x, n); % Plotting figure; subplot(2,1,1); stem(x); title('Input Signal'); xlabel('Time'); ylabel('Amplitude'); subplot(2,1,2); stem(abs(Y)); title('Magnitude of Fourier Transform (n-point DFT)'); xlabel('Frequency'); ylabel('Magnitude');
在这个示例中,我们有一个向量 x 代表我们的输入信号。我们想使用语法 Y = fft(x, n) 计算 x 的 8 点离散傅里叶变换 (DFT)。
由于 x 的长度为 4,短于 n (8),MATLAB 会在 x 的末尾添加零,使其长度为 8,然后再计算傅里叶变换。
计算傅里叶变换后,我们创建一个图形来绘制输入信号及其傅里叶变换以进行可视化。
在第一个子图 (subplot(2,1,1)) 中,我们使用 stem() 函数绘制时域中的输入信号 x。x 轴表示时间,y 轴表示信号的幅度。
在第二个子图 (subplot(2,1,2)) 中,我们使用 abs() 函数计算傅里叶变换 Y 的幅度,因为傅里叶变换可能具有复数值。然后我们使用 stem() 绘制傅里叶变换的幅度。这里,x 轴表示频率,y 轴表示傅里叶系数的幅度。
执行后的输出如下所示:
示例 4:矩阵每一行的傅里叶变换
我们的代码如下所示:
X = [1, 2, 3; 4, 5, 6]; % Compute the 4-point Fourier transform of each row n = 4; % Desired length of the Fourier transform Y = fft(X, n, 2); % Display the result disp('Matrix X:'); disp(X); disp('Fourier Transform of Each Row (n-point DFT):'); disp(Y);
在这个代码中,我们首先定义一个有两行的矩阵 X,其中每一行代表不同的信号。然后我们使用 fft(X, n, 2) 计算 X 每一行的 4 点傅里叶变换,其中 n 是傅里叶变换的所需长度。最后,我们显示原始矩阵 X 和每一行的傅里叶变换。
代码执行后的输出如下所示:
X = [1, 2, 3; 4, 5, 6]; % Compute the 4-point Fourier transform of each row n = 4; % Desired length of the Fourier transform Y = fft(X, n, 2); % Display the result disp('Matrix X:'); disp(X); disp('Fourier Transform of Each Row (n-point DFT):'); disp(Y); Matrix X: 1 2 3 4 5 6 Fourier Transform of Each Row (n-point DFT): 6.0000 + 0.0000i -2.0000 - 2.0000i 2.0000 + 0.0000i -2.0000 + 2.0000i 15.0000 + 0.0000i -2.0000 - 5.0000i 5.0000 + 0.0000i -2.0000 + 5.0000i