Я пытаюсь начать работу с DSP на моей доске Spartan-3. Я сделал плату AC97 с чипом от старой материнской платы, и до сих пор я делал это для АЦП, умножения выборок на число <1 (уменьшение громкости) и затем на ЦАП.
Теперь я хотел бы сделать некоторые базовые вещи DSP, такие как фильтр нижних частот, верхние частоты и т. Д. Но я действительно запутался в числовом представлении (целые числа? Фиксированная точка? Q0.15? Переполнение или насыщение?).
Я просто хочу, чтобы пример кода действительного простого фильтра начал меня. Нет высокой эффективности, быстро или что-то в этом роде. Просто теоретический фильтр, реализованный в VHDL.
Я искал, но я просто нахожу теоретические формулы - я понимаю, что я не понимаю, как обрабатывать подписанные 16-битные 48-кГц аудиосэмплы, которые я получаю с АЦП. Я использую эти библиотеки: http://www.vhdl.org/fphdl/ . Если я умножу свои выборки на 0,5, 0,25 и т. Д., Я смогу услышать разницу. Но больший фильтр дает мне только шум.
Спасибо.
Ответы:
Похоже, вам нужно сначала выяснить аспекты DSP, а затем сделать реализацию в FPGA.
Что касается типов данных, вы можете просто использовать целые числа.
Вот некоторый пример кода, чтобы вы начали. Обратите внимание, что в нем пропущено множество реальных проблем (например, сброс, управление переполнением), но, надеюсь, это поучительно:
источник
Простейший фильтр низких частот FIR, который вы можете попробовать, это y (n) = x (n) + x (n-1). Вы можете реализовать это довольно легко в VHDL. Ниже приведена очень простая блок-схема оборудования, которое вы хотите реализовать.
Согласно формуле, вам нужны текущий и предыдущий образцы АЦП, чтобы получить соответствующий вывод. Что вам нужно сделать, это зафиксировать входящие сэмплы АЦП на заднем фронте тактового генератора и выполнить соответствующие вычисления на переднем фронте, чтобы получить соответствующий выходной сигнал. Поскольку вы добавляете два 16-битных значения вместе, возможно, вы получите 17-битный ответ. Вы должны сохранить входные данные в 17-битных регистрах и использовать 17-битный сумматор. Ваш вывод, однако, будет младшими 16 битами ответа. Код может выглядеть примерно так, но я не могу гарантировать, что он будет работать полностью, так как я не проверял его, не говоря уже о его синтезировании.
Как видите, вы можете использовать эту общую идею для добавления в более сложные формулы, например, с коэффициентами. Более сложные формулы, такие как БИХ-фильтры, могут потребовать использования переменных для получения правильной логики алгоритма. Наконец, простой способ обойти фильтры, которые имеют действительные числа в качестве коэффициентов, - это найти масштабный коэффициент, чтобы все числа оказались как можно ближе к целым числам. Ваш конечный результат должен быть уменьшен на тот же коэффициент, чтобы получить правильный результат.
Я надеюсь, что это может быть полезно для вас и поможет вам запустить мяч.
* Это было отредактировано так, что фиксация данных и фиксация выходных данных находятся в отдельных процессах. Также используя подписанные типы вместо std_logic_vector. Я предполагаю, что ваш вход АЦП будет сигналом std_logic_vector.
источник
Еще один простой фрагмент кода (только внутренности). Обратите внимание, что я не писал VHDL напрямую, я использовал MyHDL для генерации VHDL.
Это прямая реализация. Это потребует множителей. Синтез этой схемы, предназначенной для Altera Cyclone III, не использовал никаких явных множителей, но требовал 350 логических элементов.
Это небольшой FIR-фильтр, который будет иметь следующий ответ (не такой большой), но должен быть полезен в качестве примера.
Кроме того, у меня есть пара примеров, здесь и здесь , которые могут быть полезны.
Кроме того, ваш вопрос, похоже, задает вопрос: «что является подходящим представлением с фиксированной запятой?» Часто при реализации функций DSP используется представление с фиксированной точкой, поскольку оно упрощает анализ фильтров. Как уже упоминалось, с фиксированной точкой это просто целочисленная артеметика. Реальная реализация просто работает с целыми числами, но наше предопределенное представление является дробным.
Проблемы обычно возникают при преобразовании из целочисленной реализации (с фиксированной запятой) в / с проектной плавающей запятой.
Я не знаю, насколько хорошо поддерживаются типы VHDL с фиксированной и плавающей точкой. Они будут отлично работать в симуляции, но я не знаю, будут ли они синтезироваться с большинством инструментов синтеза. Я создал отдельный вопрос для этого.
источник
OpenCores имеет ряд примеров DSP, IIR и FIR, включая BiQuad. Вам нужно зарегистрироваться, чтобы скачать файлы.
edit
Я понимаю комментарий Кортука о мертвых ссылках, и, действительно, если ссылка на OpenCores умирает, ответ станет бесполезным. Я совершенно уверен, что этого не произойдет; Моя ссылка является общей, и она умрет, только если весь домен OpenCores исчезнет.
Я попытался найти некоторые примеры, которые я мог бы использовать для этого ответа, но они слишком длинные, чтобы быть представленными здесь. Поэтому я буду придерживаться моего совета, чтобы зарегистрироваться на сайте самостоятельно (мне пришлось переехать в Нью-Йорк, потому что мой родной город не был принят) и взглянуть на код, представленный там.
источник
Я попытался реализовать сценарии для автоматической реализации фильтров БИХ, где вы можете определить, должен ли проект быть максимально быстрым (чтобы каждое умножение выполнялось с выделенным множителем) или как можно меньшим (чтобы каждый множитель использовался повторно).
Источники были опубликованы на alt.sources как «Поведенческая, но синтезируемая реализация БИХ-фильтров в VHDL» (вы также можете найти ее в архиве Google: https://groups.google.com/group/alt.sources/msg/c8cf038b9b8ceeec ? dmode = source )
Сообщения в alt.sources представлены в формате "shar", поэтому вам нужно сохранить сообщение в виде текста и разархивировать его (с помощью утилиты "unshar"), чтобы получить источники.
источник
Как насчет этого? https://github.com/MauererM/VIIRF
Он реализует БИХ-фильтр (SOS, секции второго порядка) на основе БИХ-фильтра, который заботится о реализации с фиксированной запятой. Он также имеет скрипты Python для разработки и проверки фильтра. Он не использует специфичные для поставщика FPGA-конструкции, и вы можете выбрать компромисс между быстрым и малым использованием.
источник