Помощь с пересчетом / повышением - PullRequest
3 голосов
/ 01 марта 2011

У меня есть массив из 240 точек выборки с частотой 600 Гц, что составляет 400 мс. Мне нужно пересчитать эти данные до 512 точек данных, отобранных на частоте 1024 Гц, что составляет 500 мс. Я предполагаю, что, поскольку я начинаю с 400 мс данных, последние 100 мсек просто нужно дополнить нулями.

Есть ли лучший подход для достижения этой цели?

Ответы [ 4 ]

6 голосов
/ 01 марта 2011

Если вы хотите избежать интерполяции, то вам нужно повысить частоту дискретизации до 76,8 кГц (т.е. вставить 127 0 после каждой входной выборки), фильтр нижних частот, а затем удалить (удалить 74 из 75 выборок).

4 голосов
/ 26 ноября 2012

Да для ответа эндолита, если вы хотите интерполировать x [n] простым вычислением FFT, нуля, а затем IFFT, вы получите ошибки, если x [n] не является периодическим. Смотрите эту ссылку: http://www.embedded.com/design/other/4212939/Time-domain-interpolation-using-the-Fast-Fourier-Transform-

4 голосов
/ 01 марта 2011

Вы можете использовать оконную интерполяцию Sinc, которая даст тот же результат, что и повышающая и понижающая дискретизация с использованием линейного низкочастотного фильтра FIR с оконной импульсной характеристикой Sinc.При использовании КИХ-фильтра обычно необходимо заполнить сигнал нулями по длине ядра КИХ-фильтра с обеих сторон.

Добавлено:

Другая возможность - обнулить 240 выборок с 60нули, примените БПФ, не являющееся степенью 2, длины 300, «центрируйте» заполнение нуля результатом БПФ с 212 комплексными нулями, чтобы сделать его длиннее 512, но с идентичным спектром, и выполните IFFT длиной 512, чтобы получитьпересчитанный результат.

2 голосов
/ 27 мая 2011

Преобразование / повышение дискретизации на основе 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);
...