帮助进行重新采样/上采样

3
我有一个包含240个数据点的数组,以600hz采样,代表400ms。我需要将这些数据重新采样为512个数据点,以1024hz采样,代表500ms。由于我开始有400ms的数据,所以最后100ms只需要用0填充即可。
是否有最佳方法来完成此操作?

这是音频数据还是其他来源? - AShelly
只是从传感器中获取的一些数据。 - vinbrando
4个回答

6

如果您想避免插值,那么您需要将采样率升频到76.8 kHz(即在每个输入样本后插入127个0),低通滤波,然后抽取(每75个样本中删除74个)。


512 Hz 的低通滤波器 - endolith

5
你可以使用窗口Sinc插值,它将给你与使用线性相位FIR低通滤波器和窗口Sinc脉冲响应进行上采样和下采样相同的结果。当使用FIR滤波器时,通常需要在两侧用零填充信号以达到FIR滤波器核的长度。
补充:
另一种可能性是用60个零填充240个样本,对长度为300的非2次幂FFT进行“居中”零填充FFT结果,用212个复零使其变成512长,但具有相同的频谱,并对长度为512的IFFT进行操作以获得重新采样的结果。

FFTW库包含一些非2的幂FFT非常高效的例程。 - hotpaw2
你是如何计算出60个样本的? - endolith

4

2

基于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);

1
请注意,FFT重采样假定信号是周期性的。 - endolith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接