问题
我一直在尝试在 MATLAB 中重新采样 GPS 信号。我已经使用fvatool
手工制作的传递函数(用 HP-35s 打孔)构建了一些 FIR 滤波器。大多数是 kaiser 窗口 LPF,但有些是最小二乘 LPF。我构建的所有过滤器都具有标称响应,可以充分滤除插值中的混叠。我还构建了一个 FFT 重采样工具,可以很好且非常快速地重新采样。但是,至少在我看来,我遇到了一个奇怪的异常现象。一个简单的“最近”邻居插值interp1
似乎比我所做的任何 FFT 重采样或我使用的任何上采样、滤波器、抽取工具更准确地重采样我的信号,包括dsp.FIRRateConverter
、resample
、upfirdn
,甚至是直upsample
的,filter
decimate
. 为什么是这样?谁能解释为什么会发生这种情况?我的理论是,当采样率的有理整数非常接近 1 时,直接插值将提供更准确的结果,因为您可以减少振荡和/或其他噪声失真。
背景
我的信号是标准收集的 GPS 信号,从空中提取,以 25e6 sps 采样并使用带符号的 16 位整数保存在二进制文件中。当拉入 MATLAB(由于大小而必须分块完成)时,信号是一个复杂的行向量。
我上采样到 26.25e6 sps,因此我的有理整数p和q分别是 21 和 20。要使用interp1
,我只需构建两个时间向量:
t0 = (0:1:numSamples - 1)*1/sampleRate;
t1 = (0:1:numResamples - 1)*1/resampleRate;
在哪里
sampleRate= 25e6;
resampleRate = 26.25e6;
samplingRatio = resampleRate/sampleRate;
numSamples = length(s0) % length of my original signal, sampled at 25e6 samples
numResamples = length(s0)*samplingRatio % length of my sampled signal; should equal length(s1)
s1 = interp1(t0,s0,t1,'nearest','extrap');
在使用 FIR 滤波器时,我使用了很多方法。但最简单的方法是这样调用resample
(resample 是一个最小二乘 FIR 滤波器,带有一个通过调用的 kaiser 窗口firls
被推过upfirdn
):
s1 = resample(s0,p,q);
在哪里
[p,q] = rat(resampleRate/sampleRate,1e-12);