绘制一维信号的频谱

Posted

技术标签:

【中文标题】绘制一维信号的频谱【英文标题】:Plotting spectrum of a 1D signal 【发布时间】:2013-11-07 23:14:38 【问题描述】:

我正在尝试对信号进行一些计算。该信号应该是来自 rfid 标签的测量读数,该标签由 868 MHz 载波上的 40 kHz 左右的块波调制。我拥有的信号以 250 MHz 采样,给我 1250005 个样本,这些样本存储在 .mat file 中。

现在我想绘制频谱 x[n]。我被告知要做的是对 1024 个样本的片段进行 fft。或者使用 Matlabs PSD 函数。但我正在为此苦苦挣扎。到目前为止,这是我的 Matlab 代码:

load antenna_1;
x = channel_1;

Fs = 250e6; % Sampling frequency 
t = (0:length(channel_1)-1)*1/Fs; % Time vector 
nfft = 1024; % Length of FFT

X = fft(x,nfft);
X = X(1:nfft/2);
mx = abs(X);
f = (0:nfft/2-1)*Fs/nfft; % Frequency vector

plot(t,x);
xlabel('Time (s)'); ylabel('Amplitude');
figure(2);
plot(f,mx);
xlabel('Frequency (Hz)'); ylabel('Power');

最后一个plot 向我展示了一个大约 119 MHZ 的频率分量。现在这并不完全奇怪,因为 868 MHz 信号 868 - 3*250 = 118 的混叠。但我仍然不太确定这是否确实是我信号的正确频谱?以及如何使用 psd 函数获取频谱?

【问题讨论】:

您的代码和结果图对我来说看起来不错 我期待看到由于混叠导致的多次重复信号,我不应该看到这些吗? 只有一个这样的重复属于观察到的频率跨度 (0 -- Fs/2) psd 函数已弃用,您应该改用信号分析工具箱中的pwelch。为了正确估计测量信号的频谱,此功能比手动执行一些 FFT 要好得多。 @BasSwinckels 谢谢,我试图弄清楚如何准确地实现这个功能。这就是我使用的:加载天线_1; x = 通道_1; Fs = 250e6; Nfft = 1024; [Pxx,频率] = pwelch(x,hamming(Nfft),[],[],Fs);情节(频率,Pxx);这给出了与以前相似的结果,但仍然只显示 120MHz 的一个组件,我怎么能看到更多? 【参考方案1】:

你们真的很有帮助,谢谢!

所以我改用 pwelch,代码如下:

load antenna_1;
x = channel_1;

Fs = 250e6;
Nfft = 2^10;
[Pxx,freq] = pwelch(x,hamming(Nfft),[],[],Fs);

figure;
plot(freq,Pxx);

现在这工作正常,我得到的结果与以前大致相同。但现在我想将 ~119MHz 的组件移到零。所以要在这个scheme 中从 x[n] 到 w[n]。 为此,我正在应用以下乘法:

n = 0:1:Nfft-1;
w = linspace(0,2*pi,Nfft/2+1);

Pmult = Pxx.*exp(-1j*pi*2);
F = exp(-j*w*119e6).*Pxx';

figure;
plot(freq,abs(Pmult));

但是我似乎根本无法让组件发生变化?

【讨论】:

您似乎想要进行某种解调,通过将其乘以 120 kHz 的正弦波来将峰值移至 0 Hz。在获取频谱之前,您需要在时域中执行此操作!但实际上,用另一个问题回答您自己的问题以获取更多信息并不是您应该如何使用 ***。请通读帮助部分(右上角的链接)如何提出好的问题。最好为此打开一个新问题。

以上是关于绘制一维信号的频谱的主要内容,如果未能解决你的问题,请参考以下文章

【Matlab的图形绘制和频谱计算】+和+【基本信号的表达式】

用c ++绘制频谱

音频时域图 频谱图 Spectrum

实时绘制频谱?

Matlab学习笔记 (一)-常用信号及其频谱

信号频谱 MATLAB 语法