|
|
 |
Ответов
|
Aug 12 2015, 08:21
|
Знающий
   
Группа: Участник
Сообщений: 527
Регистрация: 4-06-14
Из: Санкт-Петербург
Пользователь №: 81 866

|
Вот модель, меняя параметр WIDTH можно сравнивать реализацию fixed point FFT и floating point single precision FFT. Код clear all;
Ns = 4096; fs = 100e3; Ts = 1/fs; t = 0:Ts:(Ns-1)*Ts; SNR = 30; df = fs/Ns; f = 0:df:(Ns-1)*df;
f0 = 7e3; f1 = 19e3; A0 = 1e0; A1 = 1e-1; x = real(A0*exp(1i*2*pi*f0*t) + A1*exp(1i*2*pi*f1*t));
y = awgn(x, SNR, 'measured');
WIDTH = 16; y_fi = sfi(y, WIDTH); w = fi_radix2twiddles(Ns); w_fi = sfi(w, WIDTH);
%y = y.*w; Y_fp = abs(fft(single(y))); Y_fp = Y_fp/max(Y_fp); Y_fi = abs(fi_m_radix2fft_withscaling(y_fi, w_fi)); Y_fi_ver = double(Y_fi); Y_fi_ver = Y_fi_ver/max(Y_fi_ver); err = Y_fp - Y_fi_ver; err = err .* err;
str = sprintf('fixed point n%d', WIDTH); figure(1); clf(); subplot(2, 1, 1); hold on; plot(f, 20*log10(double(Y_fp) + 1e-15), 'b'); plot(f, 20*log10(double(Y_fi_ver) + 1e-15), 'xr'); title('ABS(FFT) result'); xlabel('frequency, Hz'); ylabel('abs(fft), dB'); legend('floating point single', str); grid on; hold off; axis([0 fs/2 -60 1]);
subplot(2, 1, 2); plot(f, 10*log10(err + 1e-15)); grid on; xlabel('frequency, Hz'); ylabel('Square error, dB'); axis([0 fs/2 -120 0]); Пример графика для вашего случая
Для 15 бит, как видно из графика, ошибка fixed point реализации пренебрежима мала в сравнении с разрешающими способностями Фурье.
|
|
|
|
|
Aug 13 2015, 08:03
|
Знающий
   
Группа: Свой
Сообщений: 869
Регистрация: 30-01-08
Из: СПб
Пользователь №: 34 595

|
Цитата(ozone @ Aug 12 2015, 10:34)  ... (точность по амплитуде совершенно не критична) ... От этого зависит выбор DSP. А Вы уверены, что это действительно так? Цитата(Fat Robot @ Aug 12 2015, 11:39)  2-3 разряда - нормальное пренебрежение. угу.
С другой стороны, если разрядность ацп - 12-13 бит, то шум кварнтования на входе будет преобладать над шумом вычислителя в s1.15 Угу. А точнее, для БПФ 4к, 16 бит, радикс-2 потребуется 1 защитный бит, и максимальный рост шума на 12-ти стадиях - в 12^0.5 раза. Т.е., собственный шум 16 бит БПФ радикс-2 можно оценивать на уровне 13 бит. Для сигнала с эффективными 12-ю битами это действительно вполне адекватно. Для радикс-4 потребуется 2 защитных бита. Потери на стадиях не изменятся (в 12^0.5 раза). Т.е., суммарная потеря на БПФ - около 4-х бит. С групповой плавающей точкой, ессно. Для чистых 12-ти бит данных этого уже маловато. И тут есть ещё один момент. Если для задачи ТС скорость критична, он должен учитывать заполнение кэша 1-го уровня данными и коэффициентами. Если оные в кэш не помещаются, производительность БПФ падает катастрофически. Так что, при оценке потребной разрядности лучше добавлять какой-то резерв, так как переход на большую разрядность БПФ может оказаться неприемлем по скорости именно из-за заполнения кэша. Кроме того, БПФ на перемножилках 1.15*1.15 потребует нормализации после каждой стадии(групповая плав. точка), что даёт проигрыш в производительности по сравнению с 32*32 того или иного вида при прочих равных. Имха, с фикс. точкой на 16-ти битах стоит связываться только при большой серийности продукции и очень жёстких ограничениях на стоимость комплектации. Для всего остального лучше сразу ориентироваться на 32*32 (фикс или плавающая - не принципиально). Только кэша 1-го уровня побольше, побольше, побольше...
|
|
|
|
|
Aug 13 2015, 17:00
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 11-08-15
Пользователь №: 87 951

|
Цитата(prig @ Aug 13 2015, 11:03)  А Вы уверены, что это действительно так? В смысле что мне не нужна точность по амплитуде? Да, в спектре интерес к амплитуде +/- лапоть, интересует именно значение частоты. Т.к. задача определить значение частоты гармонического сигнала на фоне шума. Цитата(prig @ Aug 13 2015, 11:03)  Если для задачи ТС скорость критична, он должен учитывать заполнение кэша 1-го уровня данными и коэффициентами. Если оные в кэш не помещаются, производительность БПФ падает катастрофически. Да, скорость критична. Цитата(prig @ Aug 13 2015, 11:03)  Имха, с фикс. точкой на 16-ти битах стоит связываться только при большой серийности продукции и очень жёстких ограничениях на стоимость комплектации. Для всего остального лучше сразу ориентироваться на 32*32 (фикс или плавающая - не принципиально). Только кэша 1-го уровня побольше, побольше, побольше... 16 бит я указал с запасом, как максимально возможные. Вполне вероятно АЦП 12-разрядным будет. Оно как бы да, 32 битный процессор вроде самое то, да и серийность низкая. Но дороже, больше потребление, выше порог вхождения
|
|
|
|
|
Aug 14 2015, 08:32
|
Знающий
   
Группа: Свой
Сообщений: 869
Регистрация: 30-01-08
Из: СПб
Пользователь №: 34 595

|
Цитата(ozone @ Aug 13 2015, 20:00)  В смысле что мне не нужна точность по амплитуде? Да, в спектре интерес к амплитуде +/- лапоть, интересует именно значение частоты. Т.к. задача определить значение частоты гармонического сигнала на фоне шума. ...
16 бит я указал с запасом, как максимально возможные. Вполне вероятно АЦП 12-разрядным будет.
Оно как бы да, 32 битный процессор вроде самое то, да и серийность низкая. Но дороже, больше потребление, выше порог вхождения - Я к тому, что "точность по амплитуде" - это многофакторная величина, в том числе связанная с уровнем шума. А шум Вам всё равно придётся учитывать, особенно при регистрации "слабых" сигналов. - Если рабочая полоса будет существенно ниже полосы оцифровки, ENOB может "неожиданно" увеличиться. Да и вообще, 16*16 - это очень узенькие штанишки. Всегда есть риск растолстеть и не втиснуться. - Доп. издержки для 32*32 могут с лихвой окупиться снижением затрат/времени на разработку софта, сопровождение, возможную модернизацию. А если возможна унификация элементной базы и инструментария для нескольких типов приборов, выигрыш может и умножится. (Помнится, около месяца гонял скверный редкопроявляющийся косяк. В результате нашлась одна собственная ошибка и одна незадекларированная аппаратная ошибка процессора. Аппаратная ошибка проявлялась только при определённом сочетании кода на ассемблере и некоторого специфичного набора данных. Хорошо, что пофиксилась. Но на фикс и тотальные проверки ушло ещё около месяца, так как проверялось на реальном железе с многосуточными прогонами. А всё потому, что фирменные целчисленные библиотеки для 16*16 пришлось обрабатывать напильником. Для 32*32, особенно float, потребность в обработке напильником может снизиться почти до нуля.) Для низкой серийности лучше ориентироваться на float. Софт будет проще и прозрачней, а затраты практически идентичны фикс. точке 32*32. Доступность float для самого широкого круга задач - это уже свершившийся факт. У того же TI, плав. точка фактически стала базовой для всех новых высокопроизводительных 32-битных сигнальников. А ценники и возможные издержки могут приятно удивить. Ну а если задача позволяет, STM-ы и прочие армо-мипсы могут удивить ещё больше. Так что, совет serjj может оказаться для Вас самым полезным.
|
|
|
|
Сообщений в этой теме
ozone Точность БПФ float vs fixed point Aug 12 2015, 07:34 Fat Robot Что-то у вас все "в одну кучу": и точнос... Aug 12 2015, 07:47 ViKo Цитата(serjj @ Aug 12 2015, 11:21) Вот мо... Aug 12 2015, 10:23 ozone Большое спасибо! Aug 12 2015, 08:45 serjj У меня R2010b, возможно они поменяли с того времен... Aug 12 2015, 11:27 serjj ЦитатаОно как бы да, 32 битный процессор вроде сам... Aug 14 2015, 06:17 ozone Цитата(serjj @ Aug 14 2015, 09:17) У вас ... Aug 15 2015, 16:15 Corner Использую исключительно целочисленную математику. ... Aug 28 2015, 15:18 Krys А что значит "вычисляю"? Если уже получи... Sep 3 2015, 06:12 Corner Цитата(Krys @ Sep 3 2015, 10:12) А что зн... Feb 6 2016, 13:30 Corner Прикинул я скорость на Cortex-M7 4096 FFT. Выходит... Feb 8 2016, 11:06
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|