如何在 MATLAB 中对具有任意因子(例如 - 128000Hz 到 16000.1Hz)的信号进行重采样?

信息处理 matlab 声音的 插值 下采样 重采样
2022-01-02 09:50:26

我需要在 Matlab 中使用两个麦克风模拟连续(fsCtu = 128000Hz)声学信号的采样,这些麦克风的采样率(fsMic1 = 16000,fsMic2 = 16000.1)略有偏移。做这个的最好方式是什么?

我尝试过的事情:

  • Matlab“重采样”命令仅适用于重采样到 16000,不适用于 16000.1
  • “interp1”似乎不是一个选项,因为我认为我需要使用带限插值来进行正确的模拟。(这个假设正确吗?)
  • 我尝试将我的信号写入 wav 文件并使用此软件通过系统调用对其重新采样,然后使用 wavread 加载处理后的文件。我不确定这是否是一个好的解决方案。快速测试表明,这种方法与重新采样到 16000Hz 的“resample”命令的结果不同,我觉得这很奇怪。

有什么想法或建议吗?

4个回答

有几种方法可以做到这一点。第一个是重采样,但它是一个多步骤的过程。首先,您必须弄清楚哪些插值和抽取因子将为您提供所需的采样率。

[n, k] = rat(16000.1 / 128000);

这使您获得 20000 的插值因子和 159999 的抽取因子。您将这些因子分解为更小的块。

nFactors = factor(n)
kFactors = factor(k)

事实证明,n 因子为 $2^5 * 5^4$,k 因子为 $3 * 7 * 19 * 401$。所有这些都是可行的,尽管 401 的抽取不会有很好的过滤特性。无论如何,如果您分阶段重新采样,您可以获得您想要的最终采样率。2554 and k factors to 3719401. All of those are doable, though the decimation by 401 will not have great filtering properties. Anyway, if you resample in stages you can get the final sample rate you want.

另一种方法是多项式插值本质上,您通过曲线拟合技术将信号建模为多项式,然后您可以简单地输入您想要的时间值,然后输出将弹出信号值。这种技术可能非常有效,但是很好地建模信号是一门艺术。特别是你不想过拟合

你需要的是不合理的采样率转换。当转换因子不是一个方便的基本原理数或需要在两个不同时钟源之间进行实时采样率转换时,通常需要这样做。有多种方法可以做到这一点,但最流行的一种是多相 FIR 滤波器。

有很多参数需要正确选择。这些是

  1. 过滤器长度
  2. 相数
  3. 截止频率
  4. 滤波器形状(最小二乘、等波纹等)
  5. 要求的阻带衰减,允许的通带纹波
  6. 线性或最小相位
  7. 相位插值法(如果有)

参数的选择取决于应用约束:

  1. MIPS,内存
  2. 对相位失真的敏感性
  3. 作为频率函数的噪声灵敏度
  4. 延迟要求(如果有)

这是 MATLAB 应用程序库中的一篇文章,其中更详细地描述了其中的一些内容。

http://www.mathworks.com/help/dsp/examples/efficient-sample-rate-conversion-between-arbitrary-factors.html

这列出了通过跨相位的多项式拟合的相位计算的具体实现。它主要源于这篇文章:“http://130.230.88.154/images/0/00/Cr1006-2006.pdf”,但除非您受到严重的内存限制,否则它通常不是一个好的选择。

一种可能性是使用加窗 Sinc 插值内核进行插值。

在 Matlab 中执行此操作的正确方法是:

128000 -> 16000 ==> 重采样(x,1,8)

128000 -> 16001 ==> 重新采样(x,16001,128000)

话虽如此,我不知道 Matlab 对 P&Q 有什么限制。

约翰