|
Задача |
|
|
|
Apr 11 2016, 10:40
|
Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 19-10-15
Пользователь №: 88 917

|
Я столкнулся с проблемой. Читая форум понял, что нужно сначала реализовать конкретную задачу в симуляторе, а потом (далеко потом) платами баловаться. Но вот я никак не могу выбрать задачу себе по силам. Может кто-то может дать задачи с линейным ростом в области ЦОС или близкой тематике???
Пробую сей час фильтр реализовать. Вот начинаю с вымышленного ТЗ. 1) Входные данные с АЦП 16 разрядов доп код. А выходные ? какими должны быть выходные? 32 разряда взять? 2) потом попадаю на вопрос: формат и разрядность промежуточных данных. Беру решаю все в фикс. точкой. Вопрос. Как реализовать данную арифметику? Как выбрать сколько разрядов дробные, сколько целочисленные:? Вот я выбрал формат для коэффициентов, чтобы максимально точно их описать. в VHDL, да и в матлабе я их представляю знаковыми целочисленными числами.
Тут, как я понимаю идет обычная целочисленная арифметика. Но как восстановить выходные данные....я сам как хочу интерпретирую выходные данные ? или есть некое правило по которому я могу интерпретировать выходные данные (сколько разрядов дробных )?
В общем если есть материал по практическому применению ЦОС, особенно в области прием/передачи сигналов буду рад. Можно ли следующим шагом задуматься об квадратурном модуляторе MSK?
Как я понимаю сначала надо реализовать все в прикладных пакетах (матлаб и т.п.), потом уже на VHDL, потом уже модель VHDL проверяю.
|
|
|
|
|
 |
Ответов
(1 - 14)
|
Apr 12 2016, 13:15
|
Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 19-10-15
Пользователь №: 88 917

|
Немного не в тему(мой сл. вопрос).....но все же. Вышеперечисленное изучу, как примеры. Вчера модель фильтра в матлаб вбил . По идее сначала вбиваю, как есть, потом уже ввожу ограничения на форматы данных и т.п. Взял ФНЧ КИХ фильтр 9 порядка, написал функцию фильтрации. Сначала на вход подал единичный импульс - получил коэффициенты фильтра, т.е. ИХ Взял подал на вход сумму гармонических сигналов на разных частотах с одинаковыми амплитудами 1 (рис. 1 лог масштаб sptool). И кое-что не получается. Качественно результаты на выходе похожи на правду(рис 5), но путаница с амплитудами. Беру БПФ от коэффициентов фильтра -получаю АЧХ фильтра с очень малыми амплитудами (около 0.1 не лог масштаб) (рис 4), что не сходится с полученнуми результатами (т.к. при перемножении АЧХ сигнала и фильтра получаются вообще мизерные значения) На выходе фильтра амплитуды в полосе пропускания стали чуть больше, что у меня, что и с помощью матлабовской функции filter и sptool. (рис 2) Что я не правильно делаю? Т.е. у меня по амплитудам АЧХ фильтра не получается нормально получить, остальное вроде бы согласутеся. Привел рисунки АЧХ, и поведения сигнала во времени исходного (зеленный) и фильтрованого (красный мой синий матлаб) Получение АЧХ КИХ Код %NFFT = 100 %s- коэффициенты фильтра, ИХ d=abs(fft(s,NFFT))/NFFT; d=fftshift(d); Коэффициенты КИХ Код -0.0099 0.0787 0.1166 0.1647 0.1946 0.1946 0.1647 0.1166 0.0787 -0.0099    
Сообщение отредактировал go2winner - Apr 12 2016, 13:16
|
|
|
|
|
Apr 12 2016, 16:30
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
вот скриптик для наглядности Код close all clear clc
IR = [-0.0099 0.0787 0.1166 0.1647 0.1946 ... 0.1946 0.1647 0.1166 0.0787 -0.0099];
% fvtool(IR) - удобный вариант для просмотра ИХ
Fs = 120e6; F0 = 0e6; % исходная частота step = 1e6; freq_num = 10; N = 1e4; A = 2^15 - 1;
F_vect = F0 : step : F0 + step * (freq_num - 1); signal_matr = zeros(freq_num, N);
for i = 1:freq_num % формируем исходные сигналы и signal_matr(i, :) = round(A*cos(2*pi*(F_vect(i)/Fs)*(1:N))); % смотрим их спектр, нажимая пробел % fft_plot(signal_matr(i, :), Fs, 'db') % pause end;
res_sig = sum(signal_matr); % fft_plot(res_sig, Fs, 'db')
filter_out = upfirdn(res_sig, IR, 1, 1); % filter_out = filter(res_sig, 1, IR);
fft_plot(filter_out, Fs, 'db') % видно затухание по мере удаления от постоянной составляющей %и оно совпадает с fvtool Код function [] = fft_plot(signal, Fs, mode) N = length(signal); win = hanning(length(signal)); signal = signal.*win.'; if mod(N,2) == 1 f = ((0:N-1) - floor(N/2))/N*Fs; else f = ((0:N-1) - N/2)/N*Fs; end; Y = fftshift(fft(signal,length(signal))); Y_ampl = 2*abs(Y)./N; Y_db = 20*log10(abs(Y)); if (strcmp(mode, 'db')) plot(f, Y_db - max(Y_db)) % plot(f, Y_db) set(gca,'XLim',[min(f), max(f)]) xlabel('Frequency (Hz)') ylabel('dB') title('20*log10(|Y|)') else plot(f, Y_ampl) set(gca,'XLim',[min(f), max(f)]) xlabel('Frequency (Hz)') title('Amplitude') end; end В этой же папке надо поместить эту функцию.
|
|
|
|
|
Apr 12 2016, 23:52
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 15-12-15
Пользователь №: 89 708

|
To go2winner. То, что вы начали изучение ЦОС в FPGA с нерекурсивных цифровых фильтров это правильно. Эти фильтры и не сложные для новичка, и применяются достаточно широко. Рекурсивные цифровые фильтры отбросьте в сторону, они на архитектуру FPGA ложатся плохо, у них повышенные требования к разрядностям сумматоров и умножителей. Что изучать дальше зависит от того, какие задачи вы собираетесь решать. Если, например, двигаться в сторону Software Defined Radio, то стоит присмотреться к Digital Down Converter и Digital Up Converter, ещё нужно поразбираться с децимацией и интерполяцией сигналов. Всё что написано ниже относится к FPGA Xilinx, и мне трудно сказать, насколько это справедливо для Альтеры и др. производителей. По цифровым фильтрам. В современных FPGA на программируемой логике обычно фильтры не делают, для этого используют DSP-блоки. Например, в Spartan-6, реализованы DSP-блоки DSP48A1 (это просто наименование примитива, в зависимости от семейства FPGA эти примитивы немного различаются между собой). Этот DSP блок содержит целочисленный умножитель 18x18 с 36-битным выводом результата и 48-битный аккумулятор (вспомогательные регистры, предсумматор я опустил). Для вас сейчас главное, что разрядности умножителей 18x18 -> 36, умножители целочисленные, никакой плавающей точки в DSP блоках нет. От этой разрядности можно плясать дальше. Например в 7-й серии FPGA (Virtex-7, Kintex-7, Artix-7) DSP блоки более функциональны, в том числе умножители вида 18x25 -> 43, большие точности можно получить. По вашему примеру применительно к Spartan-6. 16-битный сигнал с АЦП нужно расширить до 18 бит (здесь должно быть именно знаковое расширение) перед подачей на DSP блоки. По коэффициентам. Все коэффициенты, которые приводились выше, а именно, Код -0.0099 0.0787 0.1166 0.1647 0.1946 0.1946 0.1647 0.1166 0.0787 -0.0099 лежат в диапазоне -1 … 1. Т.о. для коэффициентов можно использовать представление чисел с фиксированной точкой 1.17. Один старший разряд, на это указывает единица перед точкой, это целая часть, по сути знак коэффициента, а остальные 17 разрядов (число после десятичной точки) – дробная часть. В 16-ричной системе счисления коэффициенты будут выглядеть так: Код 0x3FAEE 0x0284B 0x03BB3 0x05454 0x063A3 0x063A3 0x05454 0x03BB3 0x0284B 0x3FAEE Они же в десятичной: Код -1298 10315 15283 21588 25507 25507 21588 15283 10315 -1298 По сути, коэффициенты были просто домножены на 2^17 = 131072 и округлены. Теперь отсчёты сигнала и пересчитанные коэффициенты можно подавать на DSP блоки. Что будет на выходе. При умножении 18-битного целого на число с фиксированной точкой 1.17 результат будет 19.17, т.е. у нас 19 разрядов целой части числа и 17 дробной части. После суммирований результатов умножений ничего не изменяется и младшие 17 разрядов по-прежнему дробная часть. Собственно и всё. Дальше результат можно округлить и оставить столько разрядов сколько нужно. Надеюсь, не слишком туманно выразился. В качестве простенькой программки расчёта КИХ фильтров могу предложить Iowa Hills FIR Filter Designer, коэффициенты можно получить за несколько кликов мышкой и в ней же увидеть характеристики фильтра. Скачать можно здесь: http://www.iowahills.com/8DownloadPage.htmlhttp://www.iowahills.com/5FIRFiltersPage.html
|
|
|
|
|
Apr 13 2016, 13:07
|
Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 19-10-15
Пользователь №: 88 917

|
Графики и пояснения исправлю завтра и коды прикреплю (хотя имхо вопрос не в этом ) XLN, спасибо за ответ. Многое из написанного знал, но не все. Пока хочу довести и поиграться в матлабе с моделью, а потом уже на VHDL писать. step -by-step. Пока вопросы с реализацией дальнейшей опущу, лучше сам подумаю.
|
|
|
|
|
Apr 14 2016, 22:29
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 15-12-15
Пользователь №: 89 708

|
Цитата Проблема оказалась в том, что коэффициенты как-то хитро получены. Могу предположить, что фильтр с этими коэффициентами синтезирован с помощью Remez Exchange Algorithm. Почему предполагаю – в полосе подавления у нас три лепестка и все равной амплитуды (на основе скриншотов из 6-го поста), т.е. мы имеем Equiripple Low Pass Filter. Этим свойством обладают фильтры, синтезированные алгоритмом Ремеза. Мне встретился PDF, в нём в конце даже пример синтеза таких фильтров на матлабе приведён, может, будет вам полезен. Сам в матлабе не силён. A Practical Method to Design Equiripple FIR Filters http://www.geocities.ws/pablogomezr/papers...ppleFilters.pdfЦитата Полуофф. А почему ПЛИСы? А не ЦСП. Просто здесь речь идёт о цифровых фильтрах и их реализации в ПЛИС, а не на ЦСП.
|
|
|
|
|
Apr 15 2016, 05:52
|
Знающий
   
Группа: Свой
Сообщений: 790
Регистрация: 6-02-14
Из: Омск
Пользователь №: 80 379

|
Цитата(Koluchiy @ Apr 14 2016, 15:27)  А не ЦСП. офф набираю в гугле ЦСП = Цементно стружечная плита DSP = Цифровой сигнальный процессор Прикольно...
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|