Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

STM32 FFT

Вс апр 15, 2018 01:22:32

Добрый стараюсь реализовать FFT средствами <arm_math.h>.
Для начала инициализирую
Код:
arm_rfft_init_q15(&S, FFT_SIZE, 0, 1);

Далее само преобразование и тут вопрос, судя по документации ему на вход надо подавать данные с плавающей точкой в формате 1.15
Код:
arm_rfft_q15(&S,fft_Sbuff, fft_Dbuff);

НАдо ли преобразовывать как-то данные полученные с АЦП и почему?

Далее есть таблица в которой видно, что подаем мы данные в формате 1.15, а на выходе для 128 отсчетов получаем 7.9. Там же в табличке есть столбец number bits of upscale, что он значит?
Дело в том, что в следующую функцию необходимо снова подать данные в формате 1.15, а у нас 7.9
В сети находил, что полученные результат сдвигают влево на число, указанное в последнем столбце. Но почему влево, а не вправо если нам нужен формат 1.15?
Код:
arm_cmplx_mag_q15(fft_Dbuff, fft_Sbuff, FFT_SIZE);


НУ и в итоге выходные данные мы получаем в формате 2.14, что не может не радовать, как теперь получить РЕАЛЬНУЮ амплитуду отсчета?
Вложения
Screenshot_1.jpg
(38.03 KiB) Скачиваний: 704

Re: STM32 FFT

Вс апр 15, 2018 07:41:32

НАдо ли преобразовывать как-то данные полученные с АЦП и почему?

для 16битного ацп ничего не требуется делать если отсчеты со знаком. Для остальных случаев надо, чтобы данные с ацп занимали старшие биты входных для бпф отсчетов для измерений со знаком, если ацп выдает отсчеты беззнаковые то старшие биты без знака, а знак =0;

Далее есть таблица в которой видно, что подаем мы данные в формате 1.15, а на выходе для 128 отсчетов получаем 7.9. Там же в табличке есть столбец number bits of upscale, что он значит?
Дело в том, что в следующую функцию необходимо снова подать данные в формате 1.15, а у нас 7.9


формат оч простой, означает количество битов целой части и после точки - дробной. формат 1.15 это соотв XYYY YYYY YYYY YYYY где X это целая часть а Y дробная, после преобразования формат уже 7.9

то есть XXXX XXXY YYYY YYYY , если сопоставить два формата:

Код:
1.15  00 0000 X.YYY YYYY YYYY YYYY
7.9   XX XXXX X.YYY YYYY YY00 0000


короче говоря из 7.9 нельзя получить 1.15 потому что целая часть числа не влезает в 16битов. Однако можно получить какое нибудь 17.15 внутри 32битного числа сдвигая 7.9 влево на 6 битов и расширив знаковый бит на незанятые разряды 32битного числа

В сети находил, что полученные результат сдвигают влево на число, указанное в последнем столбце. Но почему влево, а не вправо если нам нужен формат 1.15?
Код:
arm_cmplx_mag_q15(fft_Dbuff, fft_Sbuff, FFT_SIZE);


НУ и в итоге выходные данные мы получаем в формате 2.14, что не может не радовать, как теперь получить РЕАЛЬНУЮ амплитуду отсчета?

Проще всего передать сразу число 7.9 в эту функцию, получить 8.8 в результате и сдвинуть его так как нужно чтобы получить величину в единицах входных отсчетов.

Re: STM32 FFT

Вс апр 15, 2018 11:56:14

для 16битного ацп ничего не требуется делать если отсчеты со знаком

Как вы это определили???
Однако можно получить какое нибудь 17.15 внутри 32битного числа сдвигая 7.9 влево на 6 битов

Почему мы так упорно стремимся получить 15 знаков после запятой, а до запятой нас не интересует, что происходит?
Хотелось бы понять именно суть.

Re: STM32 FFT

Вс апр 15, 2018 13:08:53

для 16битного ацп ничего не требуется делать если отсчеты со знаком

Как вы это определили???
Я это определил используя великое знание из книжки, конкретно то, что числа с фиксированной запятой это целые числа со знаком соответствующей разрядности. Учитывая что 16битный ацп уже выдает полный диапазон значений 16битного знакового инта, его отсчеты можно интерпретировать как форматы с фиксированной запятой полного диапазона - 1.15 , 2.14, 3.13 , 4.12 , 5.11 и так далее без всяких преобразований.

Хотелось бы понять именно суть.
Числа с фиксированной запятой это умозрительная конструкция, никакого специального формата не предусматривается. По факту это целое число со знаком, максимальное значение которого приравнивают к эквивалентному вещественному числу, например 1.15 соответствует диапазону примерно +-1.0 поскольку на целую часть отводится только знаковый бит.
Ответить