使用 FFTW 进行下采样和上采样

信息处理 fft 下采样 重采样
2022-02-27 07:34:50

我有 2 个具有不同采样率的信号,即 1ms(A) 和 4ms(B),我尝试根据代码片段对任何一个信号进行上采样/下采样基于 FFT的重新采样,我认为这相当于如何使用 fft 或 dft 重新采样音频中描述了什么

% FFTRESAMPLE Resample a real signal by the ratio p/q
function y = fftResample(x,p,q)

% --- take FFT of signal ---
f = fft(x);

% --- resize in the FFT domain ---
% add/remove the highest frequency components such that len(f) = len2
len1 = length(f);
len2 = round(len1*p/q);
lby2 = 1+len1/2;
if len2 < len1
  % remove some high frequency samples
  d = len1-len2;
  f = f(:);
  f(floor(lby2-(d-1)/2:lby2+(d-1)/2)) = [];
elseif len2 > len1
  % add some high frequency zero samples
  d = len2-len1;
  lby2 = floor(lby2);
  f = f(:);
  f = [f(1:lby2); zeros(d,1); f(lby2+1:end)];
end

% --- take the IFFT ---
% odd number of sample removal/addition may make the FFT of a real signal
% asymmetric and artificially introduce imaginary components - we take the
% real value of the IFFT to remove these, at the cost of not being able to
% reample complex signals
y = real(ifft(f));

即,使用 FFTW 库在 C++ 中重新实现了 fftResample。

问题是由于零填充,输出失真。我对 Singal 处理比较陌生,如果用户能帮助我理解,我将不胜感激:

  1. 如果我使用正确的代码片段来上采样/下采样?

  2. 突出上采样(A 到 4 毫秒)与下采样(B 到 1 毫秒)相比的优势?

2个回答

当您对信号进行下采样时,您必须确保满足奈奎斯特条件。

例如,假设信号 的频率在的采样频率 Hz。奈奎斯特频率为 Hz,因此您可以将下采样两倍而没有问题。x025x100100/2=50x

现在,假设您想将而不是这意味着新的采样频率将为 Hz。由于新的采样频率为 Hz,因此不得包含高于 Hz 的频率。但是,的频率在之间,因此会有混叠为了避免这种情况,您必须首先在 Hzx42252525/2=12.5x025x012.5

低通滤波+下采样的过程称为抽取您可以在 Wikipedia 上找到有关它的更多信息。

上采样基本上是插值,所以我会尽可能避免这种情况。我没有查看您提供的网址,请在此处完整说明您的问题。

问题是输出失真,因为

你的方法不太正确。您的问题有很好的参考 - How to resample audio using fft or dft请阅读 Bjorn Roche 对这个问题的评论。并阅读 Jim Clay 的回答。特别是第 2 点)。

通常在频域中使用频率过滤是个坏主意。有Bjorg的好博客。请参阅 -为什么 EQ 在时域中完成