2015-08-25 7 views
1

В настоящее время я пытаюсь использовать библиотеку ARM CMSIS DSP на моем чипе PS3 5Lp cortex m3.
Я столкнулся с некоторыми проблемами, используя некоторые функции, и у меня есть вопрос об использовании функций arm_cfft_q15 (или любой из функций arm_cfft_***).правильная длина FFT для функции ARM CMSIS DSP fft

Скажем, у меня есть

q15_t ADC_samples[1024]; 
    q15_t MAG_of_fft[1024]; 

и я бегу

arm_cfft_q15(1024pt_fft, ADC_samples, sample_length); 

это делает преобразований 'на месте'. Теперь из-за этого, поскольку FFT возвращает как реальные, так и мнимые значения, он фактически сможет только вернуть fft длины 512 или это 512 из 1024 образцов FFT? После получения FFT я

arm_cmplx_mag_q15(ADC_samples, MAG_of_fft, fftlength); 

fftlength где 1024.

Это возвращает MAG_of_fft и когда я сюжет, он действительно кажется, форму, что я ожидал увидеть, но я не точно знаю, как интерпретировать результаты, поскольку я не знаю, как долго мой БПФ точно. Я говорю, что я делаю 1024-битный FFT, но похоже, что он возвращает 512FT FFT или только половину 1024-битного FFT, того или другого.

Так я получаю это право? Это означает, что массив ADC_samples должен быть в два раза длиннее данных в нем, чтобы я мог получить БПФ 1024 pt? и затем я могу рассчитать величину БПФ, используя этот массив 2048, указав, что длина БПФ равна 1024?

Может кто-нибудь объяснить мне, как правильно интерпретировать эти функции и какую длину БПФ я должен ожидать?

ответ

1

Семейство функций arm_cfft работает на комплекснозначных сигналах. Другими словами, БПФ с 1024 точечной разверткой, выполненный с arm_cfft_q15, требует 1024 сложных входных выборок, которые представлены значениями 2048 q15_t (чередующиеся реальные и мнимые части, как описано в CMSIS DSP Software Library documentation). По возвращении буфер содержит 1024 комплексных значения (2048 q15_t значений), соответствующих представлению частотной области сложного входного сигнала.

Так адаптируя this example к вашему делу, вы бы вычислить FFT с:

q15_t ADC_samples[2048]; 
arm_cfft_q15(1024pt_fft, ADC_samples, 0, 1); 

Последующий вызов

q15_t MAG_of_fft[1024]; 
arm_cmplx_mag_q15(ADC_samples, MAG_of_fft, fftlength); 

с fftlength=1024 затем уменьшает 1024 комплексных значений (2048 q15_t значения) в ADC_samples до 1024 значений реальной величины (1024 q15_t) и сохраняет результат в MAG_of_fft.

В качестве побочного сведению, если вы на самом деле дело с реальным ценится сигналов, то вы могли использовать одни и те же функции и заполнения каждый второй индекс (мнимые части) из ADC_samples буфера с нулями (таким образом, используя ADC_samples буфер, вдвое превышающий фактическое количество реальных образцов). В качестве альтернативы вы можете использовать более эффективное семейство функций arm_rfft (описано в this section of the documentation).

+0

Обратите внимание, что я намеренно избегал комплексирования ответа, слишком много вливаясь в 'arm_rfft', который, кажется, не является объектом вашего вопроса (я мог бы разработать отдельный вопрос, если это необходимо). – SleuthEye

+0

Хорошо, я думаю, что это очищает мое замешательство в отношении размера ввода массива в функцию. Я также буду изучать семью arm_rfft, если у меня возникнут какие-либо вопросы, я обязательно спрошу их. Спасибо. – scarlso9

Смежные вопросы