帮助重新采样/上采样

时间:2011-03-01 15:40:56

标签: signal-processing resampling

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

有没有最好的方法来完成这个?

4 个答案:

答案 0 :(得分:6)

如果你想避免插值,那么你需要上采样到76.8 kHz的采样率(即在每个输入样本后插入127 0s),低通滤波器,然后抽取(每75个样本中掉落74个)。

答案 1 :(得分:4)

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

补充:

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

答案 2 :(得分:4)

对于endolith的响应是,如果你想通过简单地计算FFT,零填充然后IFFT来插入x [n],如果x [n]不是周期性的,你将得到错误。请参阅此参考:http://www.embedded.com/design/other/4212939/Time-domain-interpolation-using-the-Fast-Fourier-Transform-

答案 3 :(得分:2)

基于FFT的重采样/上采样非常简单......

如果你可以使用python,scipy.signal.resample应该可以工作。

对于C / C ++,如果你有真实的(而不是复杂的)数据,有一个简单的fftw技巧可以进行上采样。

nfft = the original data length
upnfft = the new data length
double * data = the original data

// allocate 
fftw_complex * tmp_fd = (fftw_complex*)fftw_malloc((upnfft/2+1)*sizeof(fftw_complex));
double * result = (double*)fftw_malloc(upnfft*sizeof(double));

// create fftw plans
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);

// zero out tmp_fd
memset(tmp_fd, 0, (upnfft/2+1)*sizeof(fftw_complex));

// execute the plans (forward then reverse)
fftw_execute_dft_r2c(fft_plan, data, tmp_fd);
fftw_execute_dft_c2r(ifft_plan, tmp_fd, result);

// cleanup
fftw_free(tmp_fd);