如何在 MATLAB 中绘制信号的频谱?

信息处理 fft 信封
2022-01-26 05:29:44

考虑 MATLAB 中的输入信号 x_total 和输出信号 y_total 的复包络:

T = 10e-9;                            
f_s = 1e12;                                             
t = [0 : 1/f_s : T]';                                       
f_c = 11.5e9;                      

f_1 = -0.1e9;                                                            
f_2 = 0;                                                                 
f   = [f_1 f_2]';

x_1 = 1*sin(2*pi*(f_c + f(1))*t);                                        
x_2 = 1*sin(2*pi*(f_c + f(2))*t);                                       
x_total = x_1 + x_2;

y_envelope = A_out .* exp(1i* theta) .* exp(1i*Phi);

2个问题:

如何绘制 x_total 的频谱?X_total = fft(x_total)产生复杂的结果。我希望我的频谱的 x 轴以赫兹为单位。

我还想绘制输出信号 y_total 的频谱。从复杂的信封中,我可以说y_total = A_out*sin(2*pi*f_c*t + (theta+Phi))吗?

我刚刚读到: A = abs(X_total) * 2/(f_s*T)应该产生幅度
并且f = linspace(0,f_s,length(X_total))应该产生相应的频率。
为什么我必须将幅度归一化2/(f_s*T)应用此代码会产生x_total我想要的频谱。
当我绘制它时,应用相同的方法y_total根本不会产生光谱。为什么不?

3个回答

为了在 matlab 中绘制频谱的幅度,您可以执行以下操作。在哪里

  • y是信号
  • fs是采样频率

代码:

spectrum = 10*log(abs(fftshift(fft(y))) / length(y));   %compute the FFT
precision = fs/length(y);
f = linspace(-fs/2+precision/2, fs/2-precision/2, length(y)); % Create the frequency axis and put the measure in the middle of the bin.
plot(f,spectrum);

瞧。

多一点解释:

  • fft(y):产生复频谱(复数的幅度和相位)。fft 函数将频谱的负部分放在右侧。
  • fftshift(fft(y)):在数据的开头带来频谱的负部分,因此它可以显示在频谱的左侧。
  • abs( fftshift(fft(y)) ):提取值的幅度,从而去除相位并产生实数。
  • abs( fftshift(fft(y)) ) /length(y) :标准化您的光谱。由于 DFT 或 FFT 是积分,数据集越大,幅度越大。通过除以样本数,我们得到一个不依赖于采集长度的幅度。做 length(y) 与 fs*T 相同(其中 T 是采集时间的长度)。
  • 10*log( abs( fftshift(fft(y)) ) /length(y) ):将在对数刻度上缩放频谱。我们经常这样做是为了能够看到更大范围的值。如果您的本底噪声为 -80dB,而您的信号为 0dB。这意味着幅度为 1,噪声水平为 0.00000001。您无法在线性图上真正看到两者。

在您的问题中,您问:

为什么我们用2/(f_s*T)

我解释了划分。至于乘以 2,我不确定您从哪里获取此信息,但我猜您查看了一个旨在显示单面光谱的示例。双面光谱上升 tu A/2。如果您测量的是真实信号(输入端没有复数值),则频谱是对称的,因此查看它的正侧更有意义。

最后,你说:

我刚刚读到: A = abs(X_total) * 2/(f_s*T)应该产生幅度并且f = linspace(0,f_s,length(X_total))应该产生相应的频率。

幅度部分是正确的。f = linspace(0,f_s,length(X_total))错误 的 你的频谱将上升到 fs/2(奈奎斯特频率)。

至于 y_envelope,您的脚本没有显示 theta 和 Phi 的值。它们是标量还是向量?

一种方法是简单地绘制绝对值:

X_total = fft(x_total);
figure;
plot(10*log10(abs(X_total).^2));

请注意,如果您的信号是真实的,则只能绘制矢量的第一部分。
另一种选择是使用韦尔奇周期图

figure;
pwelch(x_total);

离散傅里叶变换或 FFT 的幅度校正旨在更好地解释结果。例如,可以预期幅度为 1 的余弦在频域中具有幅度为 1 的峰值。代码“FFTR.m”的位应该为真实信号和单面频谱完成工作。您可以在没有输出的情况下使用它来获得具有 dB 比例的图像:

FFTR(x_total)

或使用线性刻度:

[fftR,fftAxe] = FFTR(x_total,1/f_s);plot(fftAxe,fftR,'x');grid on

在此处输入图像描述