Matlab dsp toolbox 有一个dsp.fft系统对像。Matlab通用函数也有一个FFT。下面是一个代码分别使用这两种方法计算频谱,从图中可以看出结果差别不大。
点击查看代码
%% FFT计算对比 - dsp.FFT vs MATLAB fft
clear; clc; close all;%% 参数设置
Fs = 1000; % 采样频率 1kHz
f0 = 50; % 信号频率 50Hz
A = 1; % 信号幅度
N = 256; % FFT点数
t = (0:N-1) / Fs; % 时间向量fprintf('信号: %.1fHz正弦波, 采样率%.1fHz, FFT点数%d\n', f0, Fs, N);%% 生成sin信号
signal = A * sin(2*pi*f0*t);%% 使用dsp.FFT计算
fft_dsp = dsp.FFT();
fft_dsp.FFTLength = N;
fft_output_dsp = fft_dsp(signal');
fft_output_dsp_float = double(fft_output_dsp);
mag_dsp = abs(fft_output_dsp_float(1:N/2)) / (N/2);%% 使用MATLAB fft计算
fft_matlab = fft(signal);
mag_matlab = abs(fft_matlab(1:N/2)) / (N/2);%% 频率轴
freq_axis = (0:N/2-1) * Fs / N;%% 性能分析
[peak_matlab, idx_matlab] = max(mag_matlab);
freq_matlab = freq_axis(idx_matlab);
[peak_dsp, idx_dsp] = max(mag_dsp);
freq_dsp = freq_axis(idx_dsp);error_val = abs(mag_matlab - mag_dsp);
max_error = max(error_val);
rms_error = rms(error_val);fprintf('\n性能对比:\n');
fprintf('MATLAB fft: 峰值 %.4f @ %.1fHz\n', peak_matlab, freq_matlab);
fprintf('dsp.FFT: 峰值 %.4f @ %.1fHz\n', peak_dsp, freq_dsp);
fprintf('最大误差: %.6f, RMS误差: %.6f\n', max_error, rms_error);%% 绘制图形
figure('Position', [100, 100, 1400, 600]);% 子图1: 时域信号
subplot(1,3,1);
plot(t, signal, 'b-', 'LineWidth', 1.5);
xlabel('时间 (s)');
ylabel('幅度');
title('时域信号');
grid on;% 子图2: MATLAB fft频谱
subplot(1,3,2);
stem(freq_axis, mag_matlab, 'b.', 'MarkerSize', 10, 'LineWidth', 1);
xlabel('频率 (Hz)');
ylabel('幅度');
title('MATLAB fft频谱');
xlim([0, 200]); ylim([0, 1.2]);
grid on;
hold on;
plot(freq_matlab, peak_matlab, 'ro', 'MarkerSize', 10, 'LineWidth', 2);
text(freq_matlab, peak_matlab+0.15, sprintf('峰值: %.4f\n频率: %.1fHz', peak_matlab, freq_matlab), ...'HorizontalAlignment', 'center', 'FontWeight', 'bold', 'FontSize', 9);% 子图3: dsp.FFT频谱
subplot(1,3,3);
stem(freq_axis, mag_dsp, 'r.', 'MarkerSize', 10, 'LineWidth', 1);
xlabel('频率 (Hz)');
ylabel('幅度');
title('dsp.FFT频谱');
xlim([0, 200]); ylim([0, 1.2]);
grid on;
hold on;
plot(freq_dsp, peak_dsp, 'bo', 'MarkerSize', 10, 'LineWidth', 2);
text(freq_dsp, peak_dsp+0.15, sprintf('峰值: %.4f\n频率: %.1fHz', peak_dsp, freq_dsp), ...'HorizontalAlignment', 'center', 'FontWeight', 'bold', 'FontSize', 9);% 总标题
sgtitle(sprintf('FFT计算对比 (%.0fHz正弦信号, %d点FFT)', f0, N), ...'FontSize', 14, 'FontWeight', 'bold');fprintf('\n对比完成!\n');