我有一个包含240个数据点的数组,以600hz采样,代表400ms。我需要将这些数据重新采样为512个数据点,以1024hz采样,代表500ms。由于我开始有400ms的数据,所以最后100ms只需要用0填充即可。
是否有最佳方法来完成此操作?
是否有最佳方法来完成此操作?
如果您想避免插值,那么您需要将采样率升频到76.8 kHz(即在每个输入样本后插入127个0),低通滤波,然后抽取(每75个样本中删除74个)。
如果您想通过简单计算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 = 新数据长度 double * data = 原始数据
// 分配 fftw_complex * tmp_fd = (fftw_complex*)fftw_malloc((upnfft/2+1)*sizeof(fftw_complex)); double * result = (double*)fftw_malloc(upnfft*sizeof(double));
// 创建fftw计划 fftw_plan fft_plan = fftw_plan_dft_r2c_1d(nfft, data, tmp_fd, FFTW_ESTIMATE); fftw_plan ifft_plan = fftw_plan_dft_c2r_1d(upnfft, tmp_fd, result, FFTW_ESTIMATE);
// 将tmp_fd清零 memset(tmp_fd, 0, (upnfft/2+1)*sizeof(fftw_complex));
// 执行计划(正向再反向) fftw_execute_dft_r2c(fft_plan, data, tmp_fd); fftw_execute_dft_c2r(ifft_plan, tmp_fd, result);
// 清理 fftw_free(tmp_fd);