如何在同图绘制多函数傅里叶变换及MATLAB代码无图排障
我来帮你逐个解决这两个MATLAB相关的问题:
问题1:如何在同一张图中绘制多个函数的傅里叶变换?
要在同一画布上展示多个函数的傅里叶变换,核心是统一采样参数、对齐频率轴,再用绘图保持功能叠加曲线。这里给你一个可直接复用的示例流程:
- 统一采样参数与时间轴
所有待分析的函数必须使用相同的时间轴和采样频率,这样后续的频率轴才能对齐:
Fs = 100; % 设定采样频率(单位:Hz) t = 0:1/Fs:2-1/Fs; % 生成2秒的时间轴,步长为采样周期
- 定义多个待分析函数
比如我们选三个典型信号:
f1 = sin(2*pi*3*t); % 3Hz正弦波 f2 = square(2*pi*7*t); % 7Hz方波 f3 = f1 + 0.5*f2; % 混合信号
- 计算每个函数的FFT并处理频率轴
FFT默认结果是按正频率到负频率排列的,用fftshift可以把零频移到中间,方便观察;同时归一化幅度让结果更直观:
% 计算FFT并处理 F1 = fftshift(fft(f1)/length(f1)); F2 = fftshift(fft(f2)/length(f2)); F3 = fftshift(fft(f3)/length(f3)); % 生成匹配的频率轴 freq = fftshift(fftfreq(length(t), 1/Fs));
- 叠加绘制并添加标注
用hold on保持绘图窗口,依次绘制每个变换结果,最后加图例区分:
figure; plot(freq, abs(F1), 'r-', 'LineWidth', 1.5, 'DisplayName', '3Hz正弦波'); hold on; plot(freq, abs(F2), 'b--', 'LineWidth', 1.5, 'DisplayName', '7Hz方波'); plot(freq, abs(F3), 'g:', 'LineWidth', 1.5, 'DisplayName', '混合信号'); hold off; % 美化图像 xlabel('频率 (Hz)'); ylabel('归一化幅度'); title('多个信号的傅里叶变换对比'); legend('Location', 'best'); grid on;
关键注意点:
- 必须保证所有函数的时间轴完全一致,否则频率轴无法对齐
- 归一化和
fftshift不是必须的,但能让FFT结果的可读性大幅提升 - 用不同的线型/颜色+图例,能快速区分不同曲线
问题2:MATLAB FFT绘图无图像无报错的问题分析与修复
你的代码里有两个核心问题,导致绘图异常(虽然没报错,但实际画出来的内容要么重叠到看不见,要么完全不符合预期):
问题1:x轴与y轴维度不匹配
你定义的t=0:10是11个元素(从0到10,默认步长1),所以g和g1=fft(g)都是11个元素;但x=-2:0.01:2是401个元素。当执行plot(x, abs(g1))时,MATLAB会自动把abs(g1)扩展成401行的矩阵,画出来的是一堆重叠的细线,视觉上几乎看不到,这就是你觉得“未生成图像”的原因。
问题2:频率轴定义完全错误
直接手动设定x=-2:0.01:2作为频率轴是没有依据的,FFT的频率轴必须根据采样频率和数据长度计算:
- 你的时间轴步长
dt=1,所以采样频率Fs=1/dt=1 Hz - 数据长度
N=11,正确的频率轴需要用fftfreq生成,再用fftshift把零频移到中间
修复后的完整代码
% 1. 明确时间轴步长(避免歧义) t = 0:1:10; % 步长为1,共11个采样点 g = -1*(exp(-t)+t-1); N = length(g); Fs = 1/(t(2)-t(1)); % 计算采样频率 % 2. 计算FFT并处理:归一化+移位到中心 g1 = fft(g); g1_shifted = fftshift(g1/N); % 归一化幅度,让结果更直观 % 3. 生成正确的频率轴 freq = fftshift(fftfreq(N, 1/Fs)); % 4. 绘图 plot(freq, abs(g1_shifted), 'LineWidth', 1.5); xlabel('频率 (Hz)'); ylabel('归一化幅度'); title('g(t)的傅里叶变换'); grid on;
额外优化建议:
如果想要更平滑的FFT结果,可以增加采样点,比如把t改成0:0.01:10,这样数据长度N更大,频率分辨率更高,绘图效果会更好。
内容的提问来源于stack exchange,提问作者Xuening
相关产品推荐
相关产品推荐

