3

我有一个以 600hz 采样的 240 个数据点数组,代表 400ms。我需要将此数据重新采样为以 1024hz 采样的 512 个数据点,代表 500ms。我假设因为我从 400 毫秒的数据开始,最后 100 毫秒只需要用 0 填充。

有没有最好的方法来实现这一点?

4

4 回答 4

6

如果要避免插值,则需要上采样到 76.8 kHz 采样率(即在每个输入样本后插入 127 个 0),低通滤波器,然后抽取(每 75 个样本中下降 74 个)。

于 2011-03-01T16:36:58.070 回答
4

您可以使用加窗 Sinc 插值,这将提供与使用具有加窗 Sinc 脉冲响应的线性相位 FIR 低通滤波器进行上采样和下采样相同的结果。当使用 FIR 滤波器时,通常必须在信号的两侧用 FIR 滤波器内核的长度填充零。

添加:

另一种可能性是用 60 个零对 240 个样本进行零填充,应用长度为 300 的非 2 次方 FFT,用 212 个复零“中心”对 FFT 结果进行零填充,使其长度为 512,但具有相同的频谱,并执行长度为 512 的 IFFT 以获得重新采样的结果。

于 2011-03-01T19:34:53.937 回答
4

对 endolith 的回应是,如果您想通过简单地计算 FFT、零值和 IFFT 来插值 x[n],如果 x[n] 不是周期性的,则会出现错误。请参阅此参考:http ://www.embedded.com/design/other/4212939/Time-domain-interpolation-using-the-Fast-Fourier-Transform-

于 2012-11-25T21:22:39.677 回答
2

基于 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);
于 2011-05-27T00:12:13.413 回答