400msを表す600hzでサンプリングされた240のデータポイントの配列があります。このデータを1024hzでサンプリングされた512データポイント(500msを表す)にリサンプリングする必要があります。400ミリ秒のデータから始めているので、最後の100ミリ秒は0で埋める必要があると思います。
これを達成するために取るべき最善のアプローチはありますか?
400msを表す600hzでサンプリングされた240のデータポイントの配列があります。このデータを1024hzでサンプリングされた512データポイント(500msを表す)にリサンプリングする必要があります。400ミリ秒のデータから始めているので、最後の100ミリ秒は0で埋める必要があると思います。
これを達成するために取るべき最善のアプローチはありますか?
補間を避けたい場合は、76.8 kHzのサンプルレートにアップサンプリングし(つまり、すべての入力サンプルの後に127 0を挿入)、ローパスフィルターをかけ、デシメートします(75サンプルごとに74をドロップします)。
ウィンドウ化されたSinc補間を使用できます。これにより、ウィンドウ化されたSincインパルス応答を備えた線形位相FIRローパスフィルターを使用したアップサンプリングおよびダウンサンプリングと同じ結果が得られます。FIRフィルターを使用する場合、通常、両側のFIRフィルターカーネルの長さをゼロで信号をパディングする必要があります。
追加した:
もう1つの可能性は、240個のサンプルを60個のゼロでゼロパッドし、長さ300の2乗以外のFFTを適用し、FFT結果を212個の複素数ゼロで「中央」ゼロパッドして512個の長さにしますが、スペクトルは同じです。そして、長さ512のIFFTを実行して、リサンプリングされた結果を取得します。
はい、エンドリスの応答です。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);