воскресенье, 9 февраля 2014 г.

Источник синусоидального сигнала

Продолжаем искать применение для CORDIC. Уже была демонстрация различных видов модуляции, теперь сделаем программируемый источник синусоидального сигнала. Программируемым он будет потому, что можно задать частоту выходного сигнала. Генерировать будем и синус, и косинус.
Нам нужно воспроизвести прирост аргумента, равный 2*Pi*f/F, где f - частота выходного сигнала; F - частота дискретизации. Частоту дискретизации возьмем равной 8 кГц, что соответствует одному речевому каналу. Константа 2*Pi для CORDIC была посчитана, операция деления реализована, частота f задается извне. Еще нам понадобятся временные метки, в нашем случае идущие с частотой 8 кГц. Я воспользуюсь бодовым генератором.
Проекты со временем разрастаются, поэтому постепенно я начну переезд на гитхаб. Ну что же, все основные ссылки даны, теперь картинка для привлечения внимания:

Меняем значение на входе out_freq, меняется частота на выходах sin и cos

Какие неявные ограничения есть в такой реализации? Во-первых частота дискретизации равна 8 кГц, это означает, что мы не можем генерировать частоту выше 4 кГц. Частоту повышать будем с помощью интерполирующих фильтров, но об этом потом.

Список интересующих файлов с гитхаба:
cordic_gen.v  - топовый модуль, реализующий логику приращения аргумента для модуля CORDIC.
divider.v - модуль деления с остатком, где делимое 2*Pi*f, делитель F. Смысл остатка для топового модуля следующий: как только счетчик досчитывает до значения остатка от деления, приращение, равное частному, инкрементируется на единицу и счетчик сбрасывается. 
main.v - модуль, реализующий CORDIC. 

1 комментарий:

  1. Так генератор синуса-косинуса делается в несколько строк при помощи простого аккумулятора и ПЗУшки :)

    ОтветитьУдалить