Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Поворачивающие множители для БПФ в матлаб
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Вопросы системного уровня проектирования
Acvarif
В матлаб совсем плаваю. Но вот понадобилось рассчитать (не на калькуляторе ж их считать) поворачивающие множители для БПФ (8 точек) и сразу попал в яму.
Тоесть как посчитать в матлабе это Нажмите для просмотра прикрепленного файла
Пробую делать так
n = 2;
x3=exp((-1j*2*pi*n)/8);
fprintf('%d\n',x3);
x4=cos(2*pi*n/8) - 1j*sin(2*pi*n/8);
fprintf('%d\n',x4);
получаю
6.123234e-017
6.123234e-017
Это что за число такое? Как его понимать? Как 0?
petrov
Для примера в консоли введите

exp(-j*2*pi/8) .^ mod([0:8-1].' * [0:8-1], 8) * ones(1,8).'

это DFT8 от вектора столбца состоящего из единичек.

Вводите в консоли части этого выражения и поймёте что они означают.
Acvarif
Цитата(petrov @ Sep 6 2013, 20:28) *
Для примера в консоли введите

exp(-j*2*pi/8) .^ mod([0:8-1].' * [0:8-1], 8) * ones(1,8).'

это DFT8 от вектора столбца состоящего из единичек.

Вводите в консоли части этого выражения и поймёте что они означают.

Получилось
>> exp(-j*2*pi/8)

ans =

0.7071 - 0.7071i

>> mod([0:8-1].' * [0:8-1], 8)

ans =

0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7
0 2 4 6 0 2 4 6
0 3 6 1 4 7 2 5
0 4 0 4 0 4 0 4
0 5 2 7 4 1 6 3
0 6 4 2 0 6 4 2
0 7 6 5 4 3 2 1
Виноват. Ниче не понял.
petrov
Цитата(Acvarif @ Sep 6 2013, 22:30) *
Получилось
>> exp(-j*2*pi/8)

ans =

0.7071 - 0.7071i

>> mod([0:8-1].' * [0:8-1], 8)

ans =

0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7
0 2 4 6 0 2 4 6
0 3 6 1 4 7 2 5
0 4 0 4 0 4 0 4
0 5 2 7 4 1 6 3
0 6 4 2 0 6 4 2
0 7 6 5 4 3 2 1
Виноват. Ниче не понял.


.^ поэлемнтное возведение в степень получаем матрицу DFT8
умножаем её на на любой вектор получаем DFT вектора
собственно на симметриях этой матрицы и построены FFT

Ну это так для примера, каких собственно операций вам не хватает?
Acvarif
Цитата(petrov @ Sep 6 2013, 21:56) *
.^ поэлемнтное возведение в степень получаем матрицу DFT8
умножаем её на на любой вектор получаем DFT вектора
собственно на симметриях этой матрицы и построены FFT

Ну это так для примера, каких собственно операций вам не хватает?

Я только по поводу поворачивающих множителей fft8. Правильно-ли я их вычисляю?
При n = 0 W8/0 = 1 - все верно. При n = 2 W8/2 = 6.123234e-017 (странное число) Получается равен 0?
При n = 3 W8/3 = -0.707 - вроде верно.
petrov
Цитата(Acvarif @ Sep 6 2013, 23:18) *
6.123234e-017 (странное число) Получается равен 0?


Да конечно 10^-17 ноль практически.
Acvarif
Цитата(petrov @ Sep 6 2013, 22:32) *
Да конечно 10^-17 ноль практически.

Понятно. Спасибо. Поворачивающие множители нужны для БПФ в ПЛИС.
По ходу еще тема. Можно-ли в матлаб както симитировать отдельно входы реал и мнимый fft32 (32 точки) чтобы подать на них синусоиду и косинусоиду (дискретно, по выборкам)?
petrov
Цитата(Acvarif @ Sep 6 2013, 23:44) *
По ходу еще тема. Можно-ли в матлаб както симитировать отдельно входы реал и мнимый fft32 (32 точки) чтобы подать на них синусоиду и косинусоиду (дискретно, по выборкам)?


re+j*im
Acvarif
Цитата(petrov @ Sep 7 2013, 00:53) *
re+j*im

Понятно.
Как можно в матлаб (не симулинк) симитировать работу КИХ фильтра с дециматором?
Имеются коэффициенты, центральная входная частота, частота выборок, частота децимации.
На выходе нужно получить данные от выборки к выборке (за определенный промежуток времени) нарисовать входной сигнал и выходной.
Буду признателен за подобного рода пример или ссылку на подобные примеры.
petrov
Цитата(Acvarif @ Sep 7 2013, 23:38) *
Понятно.
Как можно в матлаб (не симулинк) симитировать работу КИХ фильтра с дециматором?
Имеются коэффициенты, центральная входная частота, частота выборок, частота децимации.
На выходе нужно получить данные от выборки к выборке (за определенный промежуток времени) нарисовать входной сигнал и выходной.
Буду признателен за подобного рода пример или ссылку на подобные примеры.


Всякие готовые функции фильтрации на раз ищутся.

Но всегда можно сделать на элементарных операциях.

Адресация подвектора из вектора данных data(i : i + L-1), L - количество коэффициентов фильтра.
Перебираете в цикле подвектора соответствующие выходным отсчётам после децимации.
.* - поэлементное умножение подвектора данных и вектора коэффициентов фильтра, sum(vec) - сумма элементов вектора.

Цитата(Acvarif @ Sep 7 2013, 23:38) *
(не симулинк)


Ну и зря игнорируете инструмент облегчающий понимание.
Acvarif
Цитата(petrov @ Sep 8 2013, 09:09) *
Ну и зря игнорируете инструмент облегчающий понимание.

Да куда мне симулинк. Хотя-бы на элементарных операциях (в editor) чего нибудь написать. Уже будет прогресс.
Цитата
Адресация подвектора из вектора данных data(i : i + L-1), L - количество коэффициентов фильтра.
Перебираете в цикле подвектора соответствующие выходным отсчётам после децимации.
.* - поэлементное умножение подвектора данных и вектора коэффициентов фильтра, sum(vec) - сумма элементов вектора.

В качестве примера, как это выглядит в коде?
Это все, что мне пришло на ум.
Код
% количество коэффициентов фильтра
L = 51;
% коэффициенты фильтра
Kf = [0,-28,0,106,0,-259,-1,470,1,-658,-1,677,1,-350,-1,-455,1,1740,0,-3332,
0,4901,0,-6056,0,6481,0,-6056,0,4901,0,-3332,0,1740,1,-455,-1,-350,1,677,
-1,-658,1,470,-1,-259,0,106,0,-28,0];
% входная частота 90 кГц
f = 90000;
% частота выборок 360 кГц
fs  = 360000;
% дециматор
ds = 5;

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