我有一个以 600hz 采样的 240 个数据点数组,代表 400ms。我需要将此数据重新采样为以 1024hz 采样的 512 个数据点,代表 500ms。我假设因为我从 400 毫秒的数据开始,最后 100 毫秒只需要用 0 填充。
有没有最好的方法来实现这一点?
我有一个以 600hz 采样的 240 个数据点数组,代表 400ms。我需要将此数据重新采样为以 1024hz 采样的 512 个数据点,代表 500ms。我假设因为我从 400 毫秒的数据开始,最后 100 毫秒只需要用 0 填充。
有没有最好的方法来实现这一点?
如果要避免插值,则需要上采样到 76.8 kHz 采样率(即在每个输入样本后插入 127 个 0),低通滤波器,然后抽取(每 75 个样本中下降 74 个)。
您可以使用加窗 Sinc 插值,这将提供与使用具有加窗 Sinc 脉冲响应的线性相位 FIR 低通滤波器进行上采样和下采样相同的结果。当使用 FIR 滤波器时,通常必须在信号的两侧用 FIR 滤波器内核的长度填充零。
添加:
另一种可能性是用 60 个零对 240 个样本进行零填充,应用长度为 300 的非 2 次方 FFT,用 212 个复零“中心”对 FFT 结果进行零填充,使其长度为 512,但具有相同的频谱,并执行长度为 512 的 IFFT 以获得重新采样的结果。
对 endolith 的回应是,如果您想通过简单地计算 FFT、零值和 IFFT 来插值 x[n],如果 x[n] 不是周期性的,则会出现错误。请参阅此参考:http ://www.embedded.com/design/other/4212939/Time-domain-interpolation-using-the-Fast-Fourier-Transform-
基于 FFT 的重采样/上采样非常简单......
如果你可以使用 python,scipy.signal.resample应该可以工作。
对于 C/C++,如果你有真实的(而不是复杂的)数据,有一个简单的 fftw 技巧来上采样。
nfft = 原始数据长度 upnfft = 新数据长度 双 * 数据 = 原始数据 // 分配 fftw_complex * tmp_fd = (fftw_complex*)fftw_malloc((upnfft/2+1)*sizeof(fftw_complex)); 双 * 结果 = (double*)fftw_malloc(upnfft*sizeof(double)); // 创建 fftw 计划 fftw_plan fft_plan = fftw_plan_dft_r2c_1d(nfft,数据,tmp_fd,FFTW_ESTIMATE); fftw_plan ifft_plan = fftw_plan_dft_c2r_1d(upnfft, tmp_fd, 结果, FFTW_ESTIMATE); // 将 tmp_fd 清零 memset(tmp_fd, 0, (upnfft/2+1)*sizeof(fftw_complex)); // 执行计划(向前然后反向) fftw_execute_dft_r2c(fft_plan,数据,tmp_fd); fftw_execute_dft_c2r(ifft_plan, tmp_fd, 结果); // 清理 fftw_free(tmp_fd);