以较低的采样率 (khz) 对高频信号 (Mhz) 进行采样的技术?

信息处理 matlab fft 带宽
2022-02-25 09:35:29

我目前有一个以 48 kHz 采样率记录的 .wav 信号,中心频率为 5.260 MHz,带宽为 4 kHz。我试图从这个信号中获取一些信息,特别是使用 matlab 的频率峰值位置,我预计它在 5.260 MHz 左右。我用来生成功率谱密度的代码如下:

path = '5.260MHz.wav';
f0 = 5.260e6; % frequency 5.260 MHz

% sample properties
[x, Fs] = wavread(path); % Fs = 48 kHz
alias = 48e3*floor(f0/48e3);      % starting frequency of target alias

%estimate spectrum
[psd, f] = pwelch(x, 512, [], [], Fs);

% If the frequency lies in one of the mirror frequency bands,
% we have to rotate about half the sample rate.
if (mod(f0, 48e3) > 24e3)  
    f = Fs - f;
end

plot(f + alias, psd)

此脚本生成以下图

在此处输入图像描述

带宽确实像预期的那样是 4 kHz,但频率峰值似乎在错误的位置。我希望它们发生在 5.256 和 5.264 MHz 之间,或者可能是 5.258 和 5.262 MHz,而不是 5.276 和 5.280 MHz 之间。

但是,当我生成具有相同中心频率和带宽的自己的文件时,我在运行上述脚本时得到以下结果:

% signal properties
f0 = 5.260e6;           % frequency 5.260 MHz
sf = 4e3;               % bandwidth 4 kHz

% sample properties
fs = 24e6;              % sampling frequency 24 MHz
N = 10e6;               % number of samples

% generate random frequency modulated sinusoidal signal
fi = smooth(randn(N, 1), 11);
fi = fi / std(fi) * sf + f0;
x = cos(2 * pi * cumsum(fi) / fs);

% downsample to 48 kHz (factor 500)
x = x(1 :500: end);
fs = fs / 500;

wavwrite(x, fs, 'test_5.260MHz.wav');

在此处输入图像描述

这个情节完全符合预期,使用与第一个情节相同的脚本。我想知道我是否应该以某种方式处理第一个输入以使其正确绘制。

到目前为止,我已经尝试使用与上面相同的代码测试其他一些生成的余弦信号,它们的图形都正确。但是,我尝试过的每个数据信号都在某种程度上已经关闭(如果有用的话,我可以发布不同的样本图)。这可能是数据收集工具的错误,但更有可能是我的代码中的错误。

2个回答

您无法通过以 48 kHz 采样来捕获 5 MHz 信号。这并不意味着您的样本中没有任何东西,这意味着它将错误地代表信号。

如果您使用太小的采样频率会发生什么称为混叠:原始频率完全显示为另一个频率。从真实频率到采样频率的转换就像将无限频率轴包裹或折叠到您的有限频率间隔中的过程[0;12fs], 或者[12fs;12fs]对于复值信号。12fs也称为奈奎斯特频率。

在您的示例中,不仅主频率,而且 800 kHz 信号的总带宽都远大于采样频率。因此,我不希望出现任何明确定义的峰值。由于您似乎找到了峰值,我的猜测是这是由于您的频谱估计方法非常原始。如果您使用更好的方法,例如Welch 的修改周期图,它在 Matlab 中实现为pwelch,我希望您看到一个非常平坦(白色)的光谱。


根据 nimrodm 的评论添加:如果信号的带宽小于,我的初始陈述必须相对化12fs. 在这种情况下,如果有关于真实信号频率的额外知识,则可以使用该知识来解决混叠引入的模糊性,并且可以完美地重建真实信号。请参阅欠采样但是,无法从欠采样信号中确定真实频率,仅此而已。


一个模拟示例:Matlab 代码生成一个调频信号,峰值为 5 MHz,带宽为 400 kHz,初始采样频率为 24 MHz。

% signal properties
f0 = 5e6;               % frequency 5 MHz
sf = 0.4e6;             % bandwidth 400 kHz

% sample properties
fs = 24e6;              % sampling frequency 24 MHz
N = 10e6;               % number of samples

% generate random frequency modulated sinusoidal signal
fi = smooth(randn(N, 1), 11);
fi = fi / std(fi) * sf + f0;
x = cos(2 * pi * cumsum(fi) / fs);

估计频谱使用pwelch

% estimate spectrum
[psd, f] = pwelch(x, 512, [], [], fs);
figure
plot(f, psd)
xlabel('f [Hz]')
ylabel('normalized power spectral density [1/Hz]')

给出这个结果:

如果信号被下采样到 48 kHz

% downsample to 48 kHz (factor 500)
fs = fs / 500;
x = x(1 :500: end);

估计的频谱如下所示:

正如预期的那样,这基本上是一个白色(平坦)光谱,并且许多小的“峰值”是随机波动,因为该光谱仅基于原始 1000 万个样本中的 500 个样本进行估计。可以通过重复该过程并对不同结果进行平均来改进估计。

如果带宽更改为 4 kHz

sf = 4e3;               % bandwidth 4 kHz

原始信号和下采样信号的频谱估计结果如下所示:

较窄的峰值非常适合下采样频谱估计的 0 到 24 kHz 范围,它只是必然出现在错误的位置,在本例中为 8 kHz。

8 kHz = 5 MHz – 104 · 48 KHz 是 5 MHz 相对于 48 kHz 采样率的最小混叠,其次是 48 kHz – 8 kHz = 40 kHz(反映在 24 kHz 的奈奎斯特频率附近)。所有较大的混叠都是通过将 48 kHz 的整数倍相加从这两个中派生的:56、88、104、136 kHz 到 4952、4984、5000、5032 kHz 等等。

由于频谱估计无法区分这些混叠,频谱图的频率轴变得不明确:它不能表示信号从 0 到 24 kHz 的频率分量,而是表示从 48 到 24 kHz 的频率(由于镜像而向后) !),

或从 48 到 72 kHz,依此类推。

如果我们知道信号的频率成分在 5 MHz 左右,我们可以选择相应的混叠频率区间,4992 到 5016 kHz,

并在 5 GHz 处恢复峰值的正确位置。

但是,如果信号的带宽大于12fs,因为信号的真实频率内容在这些频率间隔中的几个之间存在混叠。

您可以使用远低于信号/频谱内容频率两倍的采样率来捕获更高频率的信号。这称为欠采样。为了有用,必须知道信号频率在采样率之上大约有多少“折叠”,必须没有基带(或其他折叠频谱)信号混叠,因此信号的带宽必须更窄大于 Fs/2,信号的频谱不能跨越 Fs/2 的任何倍数。采样时钟的抖动也必须非常低(低至时钟频率远高于信号频率的采样器所需的最大绝对时间抖动。)

这与基带采样没有什么不同,因为需要先验知识(事实上,信号是正确的低于 Fs/2 的低通滤波基带)才能正确重建原始信号,