Продолжаем искать применение для 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.
Так генератор синуса-косинуса делается в несколько строк при помощи простого аккумулятора и ПЗУшки :)
ОтветитьУдалить