Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: RealFFT & ComplexFFT
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
viterra
Перешли на другой процессор а в библиотеке для него нет Real FFT.. В связи с этим возникает вопрос - как преобразовать входные данные (данные от АЦП) чтоб результат на выходе Complex FFT был аналогичен Real FFT ?
fontp
QUOTE (viterra @ Oct 28 2010, 11:52) *
Перешли на другой процессор а в библиотеке для него нет Real FFT.. В связи с этим возникает вопрос - как преобразовать входные данные (данные от АЦП) чтоб результат на выходе Complex FFT был аналогичен Real FFT ?


Риал это тоже комплекс, только с нулевой мнимой частью. Поэтому после каждого отсчета АЦП достаточно вставить 0 для мнимой части и вызвать Сomplex. Будет аналогично, но вычислено 2 раза. Только это вычислительно неэффективно. Очевидно можно повысить эффективность почти в 2 раза обрабатывая сразу две действительных последовательности, замешивая их с нужной симметрией. Это просто и описано в любой книжке Рабинера-Голда))

здесь есть как правильно считать одну последовательность без лишних издержек
http://wasm.ru/forum/attachment.php?item=3567
viterra
Спасибо! Наткнулся ещё на такое описание http://processors.wiki.ti.com/index.php/Ef...n_of_Real_Input
Походу я что-то не понимаю... Механизма у меня не пашет.

float mq15tofl(short a){return ((float)a / (float)0x8000);}

void GenRealTransform(void)
{
int i;
int n=FILTER_FFT_SIZE;
for (i = 0; i < FILTER_FFT_SIZE; i++)
{
FILTER_FFT_REAL[2 * i] = mfl2q15(0.5 * (1.0 - sin (2 * PI / (double) (2 * n) * (double) i)));
FILTER_FFT_REAL[2 * i + 1] = mfl2q15(0.5 * (-1.0 * cos (2 * PI / (double) (2 * n) * (double) i)));
FILTER_FFT_REAL[FILTER_FFT_SIZE + 2 * i] = mfl2q15(0.5 * (1.0 + sin (2 * PI / (double) (2 * n) * (double) i)));
FILTER_FFT_REAL[FILTER_FFT_SIZE + 2 * i + 1] = mfl2q15(0.5 * (1.0 * cos (2 * PI / (double) (2 * n) * (double) i)));
}
}

void FFT_Split (int n, short *restrict pIn, short *pATable, short *pBTable, short *pOut)
{
int i;
short Tr, Ti;

pIn[2 * n] = pIn[0];
pIn[2 * n + 1] = pIn[1];

#pragma UNROLL(2)
for (i = 0; i < n; i++)
{
Tr = ((int)pIn[2 * i] * pATable[2 * i]>>15 - (int)pIn[2 * i + 1] * pATable[2 * i + 1]>>15 + (int)pIn[2 * n - 2 * i] * pBTable[2 * i]>>15 + (int)pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]>>15);

Ti = ((int)pIn[2 * i + 1] * pATable[2 * i]>>15 + (int)pIn[2 * i] * pATable[2 * i + 1]>>15 + (int)pIn[2 * n - 2 * i] * pBTable[2 * i + 1]>>15 - (int)pIn[2 * n - 2 * i + 1] * pBTable[2 * i]>>15);

pOut[2 * i] = Tr;
pOut[2 * i + 1] = Ti;
// Use complex conjugate symmetry properties to get the rest..
pOut[4 * n - 2 * i] = Tr;
pOut[4 * n - 2 * i + 1] = -Ti;

}
pOut[2 * n] = pIn[0] - pIn[1];
pOut[2 * n + 1] = 0;

}


DSP_fft16x16(FILTER_FFT_TWIDDLE,FILTER_FFT_SIZE,FILTER_FFT_MEMORY, FILTER_FFT_RESULT);
FFT_Split(FILTER_FFT_SIZE, FILTER_FFT_RESULT, FILTER_FFT_REAL, FILTER_FFT_REAL+FILTER_FFT_SIZE, FILTER_FFT_MEMORY);
MrAlex
Цитата(viterra @ Oct 28 2010, 12:53) *
Спасибо! Наткнулся ещё на такое описание http://processors.wiki.ti.com/index.php/Ef...n_of_Real_Input
Походу я что-то не понимаю... Механизма у меня не пашет.


Механизм рабочий.
Сдается TI финансирует исследования в области математики.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.