我目前有一个以 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');
这个情节完全符合预期,使用与第一个情节相同的脚本。我想知道我是否应该以某种方式处理第一个输入以使其正确绘制。
到目前为止,我已经尝试使用与上面相同的代码测试其他一些生成的余弦信号,它们的图形都正确。但是,我尝试过的每个数据信号都在某种程度上已经关闭(如果有用的话,我可以发布不同的样本图)。这可能是数据收集工具的错误,但更有可能是我的代码中的错误。