Эффект Эхо

Приходит Новый Год!
Поздравляем читателей нашего блога с праздником!
Приготовили новогодний проект для платы Марсоход2.

Идея проекта такая: подключаем к плате Марсоход2 гитару, и внутри ПЛИС делаем какой нибудь звуковой эффект. Из простых и понятных и эффектных эффектов – эхо.
Эффект эха хорош тем, что скрывает погрешности игры у плохих гитаристов вроде меня :-) и, иногда, может создавать иллюзию быстрой игры. Не знаю насколько эхо слышно в моем видео, но я старался..

Реализовать «эхо» довольно просто.

Сперва оцифровываем звуковой сигнал с помощью АЦП. На плате Марсоход2 уже есть АЦП, только нужно чуть чуть усилить сигнал с гитары, уж больно он слабоват. Мы сделали буквально навесным монтажом усилитель прямо на платке шилда разъемов.

плата Марсоход2 с шилдом разъемов

Ну и припаяли еще разъем для гитары.
Оцифровка звука из гитары ведется на частоте 40КГц. Эта частота берется из PLL.

Оцифрованный сигнал поступает на сумматор, который складывает его с задержанным сигналом. Вот фрагмент схемы проекта Altera Quartus II:

схема эффекта ЭХО

Модуль сумматора “adder” реализован на Verilog HDL. Он конечно не только суммирует.
ФИФО для задержки звука у меня довольно длинное. Тут у меня 8 последовательных компонентов FIFO каждый по 2048 элементов. Даже не знаю, как такой проект поставить в виде картинки – узкий и длинный:

схема эхо эффекта

Таким образом, суммарная длина FIFO 16К, и это примерно 0,4 секунды задержки при частоте оцифровки 40КГц.

Модуль adder управляется кнопочкамми платы Марсоход2 – можно регулировать задержку эха выбирая один из восьми выходов каждого из отдельных компонентов ФИФО:


reg [2:0]echo_selector;
always @(posedge key_poll_clk)
begin
    if(key0_==2'b10)
        echo_selector <= echo_selector + 1;
end

reg [7:0]selected;
always @*
    case (echo_selector)
        3'h0: selected = in0;
        3'h1: selected = in1;
        3'h2: selected = in2;
        3'h3: selected = in3;
        3'h4: selected = in4;
        3'h5: selected = in5;
        3'h6: selected = in6;
        3'h7: selected = in7;
    endcase


Суммирование происходит не с полным задержанным сигналом, а с «ослабленным»:


//summ sound with delayed echo
reg [8:0]q;
always @(posedge clock)
    q <= snd + selected[7:1] + selected[7:2];


selected[7:1] – это половина амплитуды сигнала, а selected[7:2] – это четверть сигнала.
Таким образом, задержанный сигнал ослаблен и составляет ? исходного.

С выхода сумматора сигнал подается на линию задержки в виде FIFO. С выхода FIFO сигнал идет на сумматор обратной связью. Получается возможным многократное повторение звука с затуханием

Ну и, конечно, с выхода сумматора сигнал идет на воспроизведение. Здесь я использую тот же модуль DeltaSigma ЦАП, который у нас уже был в другом проекте.

Весь проект можно взять посмотреть вот здесь:

 


Добавить комментарий