Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Порядок данных на выходе функции ifft()
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Вопросы системного уровня проектирования
lexus.mephi
Сверяю данные на выходе блока IFFT на Verilog и matlab'овской моделью. Матлабовская модель эталонная, поэтому стараюсь полностью повторить ее поведение на Verilog.
С операцией fftshift кое-как разобрался, т.ч. данные вроде должны правильно подаваться. А вот с функцией ifft - беда. Не могу найти, в какой последовательности она выдает данные.
NFFT - размер IFFT (допустим, 1024). На остальные множители не обращайте внимание.
Код
    % FFT shift
    fftDI = fftshift(fftDI, 2);

    % IFFT
    DataOut{misoGroup} = 5/sqrt(27*C_PS)*NFFT*ifft(fftDI, NFFT, 2);


ifft(fftDI, 1024, 2) - в каком порядке пойдут данные после этого преобразования?

Спасибо!
RobFPGA
Приветствую!

На вход ifft нужно подавать данные в том же порядке как на выходе fft, то есть ifft(fft(sig))==sig;
По индексам частот вот так - 0, 1, 2,..., N/2-1, -N/2, -N/2-1 ,...,-1. где N длинна fft.

В Вашем случае нужно опять сделать fftshift - ifft(fftshift(fftDI), NFFT, 2);

Успехов! Rob.
lexus.mephi
Цитата(RobFPGA @ Mar 1 2013, 11:04) *
Приветствую!

На вход ifft нужно подавать данные в том же порядке как на выходе fft, то есть ifft(fft(sig))==sig;
По индексам частот вот так - 0, 1, 2,..., N/2-1, -N/2, -N/2-1 ,...,-1. где N длинна fft.

В Вашем случае нужно опять сделать fftshift - ifft(fftshift(fftDI), NFFT, 2);

Успехов! Rob.


Как подавать данные мне, к сожалению, выбирать нельзя - нужно четко делать, как в Matlab-модели.
1) У меня 853 несущие (для режима 1K).
2) Я дополняю их нулями слева и справа до 1024.
3) Дальше делаю fftshift(fftDI, 2) над данными, т.е. меняю половинки местами.
4) Подаю все это на ifft - DataOut{misoGroup} = 5/sqrt(27*C_PS)*NFFT*ifft(fftDI, NFFT, 2);

Пункты 1-4 заложены в матлабовской модели, а я их всего-лишь повторяю на RTL.

5) В какой последовательности данные будут на выходе?

P.S. На выходе ifft обратной операции fftshift не делается.
_Anatoliy
Цитата(lexus.mephi @ Mar 4 2013, 10:04) *
P.S. На выходе ifft обратной операции fftshift не делается.


На выходе ifft операция fftshift не имеет смысла. Её нужно делать перед ifft, RobFPGA же написал
Код
ifft(fftshift(fftDI), NFFT, 2);
lexus.mephi
Цитата(_Anatoliy @ Mar 7 2013, 12:48) *
На выходе ifft операция fftshift не имеет смысла. Её нужно делать перед ifft, RobFPGA же написал
Код
ifft(fftshift(fftDI), NFFT, 2);


Не спорю. Это было лишнее предложение )

В итоге выяснилось - ifft выдает данные в natural order.

К сожалению, у меня на выходе RTL bit-reverse, поэтому теперь возникла необходимость в перегруппировки данных. Прошу прощения за оффтоп, но никто не реализовывал reorder buffer для ifft на Verilog?
RobFPGA
Приветствую!

Цитата(lexus.mephi @ Mar 7 2013, 13:52) *
В итоге выяснилось - ifft выдает данные в natural order.

К сожалению, у меня на выходе RTL bit-reverse, поэтому теперь возникла необходимость в перегруппировки данных. Прошу прощения за оффтоп, но никто не реализовывал reorder buffer для ifft на Verilog?


А кто вам мешает сделать корку FFT с natural output?

Если же такой нет то сделать буфер несложно -

вариант для быстрых и богатых :
2х банковый буфер - пишем в bit-reverse, в конце переключаем банк и начинаем читать из записанного банка в normal или в другой удобной последовательности (например как после fftshift). Новые данные пишем во второй банк.

вариант для среднего класса:
1 буфер - пишем по очереди в bit-reverse/normal последовательности а читаем соответственно в normal/bit-reverse
Переключение вариантов записи и начало чтения происходит по окончанию записи.

ну и вариант для медленных и бедных:
1 буфер - пишем bit-reverse последовательности а читаем соответственно в normal.
Пока не вычитаем, новые данные записывать нельзя.

Нужный вариант выбираете в зависимости от толщины вашего коше... FPGA sm.gif

Успехов! Rob.
lexus.mephi
Цитата
А кто вам мешает сделать корку FFT с natural output?


Ну я пока пытаюсь обойтись без Altera FFT Megafunction. Смог реализовать алгоритм, где на выходе bit-reverse.

Цитата
Если же такой нет то сделать буфер несложно -

вариант для быстрых и богатых :
2х банковый буфер - пишем в bit-reverse, в конце переключаем банк и начинаем читать из записанного банка в normal или в другой удобной последовательности (например как после fftshift). Новые данные пишем во второй банк.

вариант для среднего класса:
1 буфер - пишем по очереди в bit-reverse/normal последовательности а читаем соответственно в normal/bit-reverse
Переключение вариантов записи и начало чтения происходит по окончанию записи.

ну и вариант для медленных и бедных:
1 буфер - пишем bit-reverse последовательности а читаем соответственно в normal.
Пока не вычитаем, новые данные записывать нельзя.


Вот тут или я где-то туплю, или действительно все так просто =)
Есть bit-reverse на выходе:
0 4 2 6 1 5 3 7

Мне нужен natural order:
0 1 2 3 4 5 6 7

Мне разве не нужна память с адресами, чтобы прочитать данные в natural order? Bit-reverse это же не просто Вам - 7 6 5 4 3 2 1 0 =)



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