Страница 3 из 4 Первая 1234 Последняя
Показано с 41 по 60 из 63

Тема: Экономичная реализация арифметики ЦОС в аудио

  1. #1 Показать/скрыть первое сообщение.
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,943

    По умолчанию Экономичная реализация арифметики ЦОС в аудио

    Просто FIR интерполятор - вещь достаточно банальная, а вот оптимизация ресурсов - задача более интересная.
    Поэтому новая ветка про оптимизацию. Предлагаю пообсуждать решения по оптимизации арифметики на FPGA и MCU для аудио ЦОС.
    Предыдущий проект со ссылками на другие ветки здесь.

    С появлением недорогих FPGA GoWin оптимизация вроде как особо и не нужна. Но в наших (отечественных) реалиях ассортимент и стоимость микросхем могут быть не самые лучшие.
    Ну а кроме того, у меня уже давно были мысли уместить ЦФ в LCMXO2-1200, т.к. это недорогая FPGA со встроенной флешью и в компактном исполнении: QFN-32 5x5mm. Что так же послужило поводом для нового проекта и стало целевой задачей при разработке.
    Несколько лет назад я прикидывал, что туда поместится только что-то совсем простое, вроде SM5842. Однако с опытом работы в верилоге получилось ужать арифметику настолько, что даже в такой скромный чип помещается нормальный полноценный апсемплер с шейпером.

    Кое что из стандартных приемов оптимизации уже описывал в проекте DF1.
    Теперь дополнил подробнее (документ во вложении ниже).
    Изначально мысль ужать ресурсы возникла из того обстоятельства, что в DF2 для первой ступени х2 интерполятора использовались каскады с максимально широкой полосой пропускания (максимально узкой переходной полосой). Сделал я это по аналогии со старыми микросхемами ЦФ, типа SM5847.
    Но потом подумал - а собственно нафига?
    В интегральных ЦФ первая ступень для любой входной частоты семплирования сделана максимально широкополосной чисто из соображений экономии: тупо используется одна и та же логика, просто на разной частоте.
    А на FPGA ситуация обратная: максимальная частота тактирования лимитирована, а добавить несколько наборов коэффициентов для разной входной частоты семплирования - не проблема.
    Частоты выше 20кГц все равно не слышно, поэтому переходную полосу можно сделать более пологой (сделать полосу пропускания для всех входных частот семплирования в районе 20кГц).
    Это не только укорачивает импульсную хар-ку фильтра, сохраняя преимущества Hi-Res контента, но и потенциально упрощает фильтрацию в аналоге: чем шире полоса пропускания, тем шире и ее отражение на частоте семплирования.
    А если так, то кол-во тактов, необходимых для обсчета фильтра резко уменьшается. На столько, что при тактировании частотой 1024Fs можно успеть обсчитать оба канала по очереди, что и стало основным нововведением в проекте DF3E. Т.е. в данном ЦФ блок многоступенчатого FIR апсемплера запускается вдвое чаще, чем в DF2.

    Правда одного сужения полосы первой ступени интерполятора оказалось недостаточно для поочередной обработки каналов.
    Поэтому для DF3E проекта были так же оптимизированы полуполосные каскады интерполяторов (сокращены до минимума). Из-за этого боковые лепестки в полосе задержания получились повыше, чем в DF2 проекте, но только на частотах кратных 705кГц, где они легко дофильтровываются аналоговым ФНЧ.
    Еще немного тактов удалось сэкономить оптимизацией алгоритма умножения центрального отвода полуполосных каскадов. В DF2 это умножение, как и остальные, выполнялось за два такта, а в DF3E - за один.

    Для упрощения модуля приема пакетов SPI обработка выполняется сразу по приему данных одного канала: приняли левый - запустили обработку, приняли правый - запустили обработку.
    Данное обстоятельство накладывает ограничение на входной I2S фрейм, в котором сигнал LRCK обязан иметь скважность 50%. Но я еще не сталкивался со случаями, когда данное условие не выполняется.
    Кроме того, обработка в остальных блоках так же выполнена последовательной, что позволило серьезно сэкономить еще и на шейпере и дополнительных амсемплерах. Кто пользовал DF2 сразу почувствует разницу.

    Что еще стоит отметить - добавлено округление с дизером в маке. Что позволило уменьшить разрядность шины данных до 22 бит, а так же - сделало входной аттенюатор фактически беспотерьным даже при малой разхрядности шины данных, и его теперь можно использовать как качественный цифровой РГ.
    Округление с дизером было и в самом первом проекте DF1, но теперь оно выполнено более аккуратно.
    Дизеры для мака и для округления выходных данных выполнены на LFSR со сдвигом на 16 тактов перед выборкой. Если использовать сдвиг на 2^N тактов, то длина генерации последовательности до повтора получается такая же, как и при сдвиге на один такт (т.к. 2^N всегда некратно максимальной длине последовательности LFSR).
    Так же, в ходе экспериментов с округлением на сигналах малой разрядности выяснил, что амплитуда дизера должна быть не менее +/-1 LSB, иначе получается модуляция шума, хотя на спектре следов квантования не видно.
    Для округления данных на выходе добавлена опция дизера с треугольным распределением. Шум которого на 3дБ ниже, чем с прямоугольным. Однако это имеет значение только для округления без шейпера.
    Наличие даже самого простого шейпера 1-го порядка исключает модуляцию шума и можно использовать самый простой шум с равномерным распределением минимальной амплитуды: +/-0.5LSB.

    Схему отработки переполнения наоборот упростил: убрал дополнительный аттенюатор перед шейпером.
    Теперь аттенюация отдана на откуп пользователю проекта, который должен сам решать - на сколько ослабить сигнал в случае вывода данных малой разрядности с шейпингом.

    Ну и отдельно стоит упомянуть про такую вещь, как асинхронное тактирование ядра в DF3E. Для этого выделен отдельный порт "CCLK".
    Типовая тактовая частота для данного проекта 1024Fs.
    Однако, в случае отсутствия тактовых генераторов на такую частоту, можно применить например 512Fs генераторы, а ядро фильтра (а так же ядро DSD дециматора) затактировать любой произвольной частотой, не обязательно кратной 1024Fs (например от встроенного в FPGA генератора).
    Это не только позволяет сохранить производительность при низкой частоте тактовых генераторов, но и при необходимости - поднять тактовую частоту и увеличить длину фильтров.
    Подняв частоту вдвое получим производительность DF2 (если конечно позволит быстродействие выбранной плисины).

    В архиве проект DF3E с исходниками, как обычно в альфа версии, т.к. протестировать весь накрученный функционал слишком трудоемко.
    В файле с примерами приведено два проекта:
    1. Вывода на параллельный ЦАП с возможность приема DSD битстрима.
    2. Вывод данных с соневского модулятора дифференциальными битстримами на PCM179x в моно-включении в режиме DSD.

    Помимо исходников в архиве есть графики частотных хар-к в разных режимах (включая хар-ки DSD дециматоров), диаграммы управляющих сигналов и данных, а так же доработанная утилита (и ее исходник) для преобразования коэф-тов, сгенерированным в матлабе.
    Модули вывода SAI_OUTPUT взяты с проекта DF2 с чисто косметическими доработками, поэтому его описание не делал.
    Вложения Вложения
    Последний раз редактировалось dortonyan; 26.02.2025 в 23:38.

  2. #41
    Завсегдатай Аватар для Михаил45
    Регистрация
    09.03.2007
    Адрес
    Санкт-Петербург
    Возраст
    63
    Сообщений
    2,183

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио


    Offтопик:
    Так музыку слушай и все. Это самое главное, остальное - суета с паяльником. В принципе самое верное - продать все барахло и купить нормальный усилитель, колонки, источники фабричного производства насколько хватит денег.

  3. #42
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,943

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Обновил исходники в заглавном посте.
    Добавил описание ядра и входных модулей.
    Исправил касяк с mute режимом SAI_IN модуля.
    Заменил шейпер на еще более экономичный (в описании схему не менял, т.к. оптимизация поочередной обработкой каналов аналогичная).
    Ну и чуть подрихтовал соневский модулятор: подправил пару коэф-тов, сохранив отднобитность и нарастив усиление в петле на 5дБ.
    Устойчивость наверное стала пониже, но при использовании оверсемплинга х64 и выше - думаю это не критично.

  4. #43
    Завсегдатай Аватар для Михаил45
    Регистрация
    09.03.2007
    Адрес
    Санкт-Петербург
    Возраст
    63
    Сообщений
    2,183

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Алексей спасибо за поддержку красивого и полезного проекта!

    Для задействовапия в ядре клока cclk надо просто заремарить clk в настройках core?

  5. #44
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,943

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Не понял что есть "заремарить".
    CCLK - это просто вход тактирования логики ядра. Для его использования ничего настраивать не надо, просто подать клок. Можно синхронный, можно асинхронный, без разницы.
    Главное чтобы кол-во тактов этого клока на период частоты 44,1/48кГц было не менее 1024. Т.е. если подать клок частотой 1024 Fs, то это условие выполняется.

  6. #45
    Завсегдатай Аватар для Михаил45
    Регистрация
    09.03.2007
    Адрес
    Санкт-Петербург
    Возраст
    63
    Сообщений
    2,183

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Понял, спасибо. Заремарить - сленг, # или // , любой принятый символ поставить, чтоб строчка кода не выполнялась.

  7. #46
    Не хочу! Аватар для Alex
    Регистрация
    20.03.2003
    Адрес
    Worldwide
    Возраст
    62
    Сообщений
    39,138

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Не понял что есть "заремарить".
    Закоментировать строчку
    В зависимости от языка - /*..*/, //, ;. #, \, <!-- -->, и прочее а происходит оно от "REM" в Бейсике и .bat - только у нас всегда говорили не "заREMарить" а "заREMить"
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Да мне-то что, меняйтесь!"(с)анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

  8. #47
    Завсегдатай Аватар для Михаил45
    Регистрация
    09.03.2007
    Адрес
    Санкт-Петербург
    Возраст
    63
    Сообщений
    2,183

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Да да, точно, у всех по разному. Как то у линуксоидов что ли принято, привык.

  9. #48
    Частый гость Аватар для vladsan75
    Регистрация
    06.06.2010
    Адрес
    г.Саратов
    Возраст
    50
    Сообщений
    447

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Добрый вечер, Алексей скажите, это правильный кусок кода?:
    always @ (negedge LRC) rDSDEN <= (rBCNT<15);
    как можно присвоить сравнение? Это строка № 272 в DFS3E_EXAMPLES.
    Или там результат будет 0 или 1, просто я недавно начал изучать verilig и пока не все моменты понятны.

  10. #49
    Завсегдатай Аватар для Yurgen
    Регистрация
    23.05.2005
    Адрес
    Из Замкадья
    Возраст
    53
    Сообщений
    1,624

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Цитата Сообщение от vladsan75 Посмотреть сообщение
    Добрый вечер, Алексей скажите, это правильный кусок кода?:
    always @ (negedge LRC) rDSDEN <= (rBCNT<15);
    как можно присвоить сравнение? Это строка № 272 в DFS3E_EXAMPLES.
    Или там результат будет 0 или 1, просто я недавно начал изучать verilig и пока не все моменты понятны.
    chat.deepseek.com в помощь

    Нажмите на изображение для увеличения. 

Название:	Screenshot from 2025-05-10 19-32-16.png 
Просмотров:	43 
Размер:	73.1 Кб 
ID:	473345


    Цитата Сообщение от tomtit Посмотреть сообщение
    Китайцы похоже частично скопировали железо от Mola-Mola, даже дискретные регуляторы напряжения можно рассмотреть. Результат достойный, даже не стыдно измерения показать, в отличие от других.
    https://www.toppingaudio.com/product...ontent-section
    Молодцы, однако!.
    Прикольно, даже передачу IIS через HDMI шнурок сделали как у АДВ было когда то давно.
    Make Linux Great Again

  11. #50
    Частый гость Аватар для vladsan75
    Регистрация
    06.06.2010
    Адрес
    г.Саратов
    Возраст
    50
    Сообщений
    447

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    И еще вопросик, чтобы добавить ассинхронный клок надо добавить вход, ну типа:
    input СCLK,
    а потом в обьявлении модуля CORE прописать:
    .iCCLK( СCLK ), // asyncronouse core clock
    ?

    ---------- Сообщение добавлено 20:47 ---------- Предыдущее сообщение было 20:38 ----------

    Благодарю, Yurgen, но по вашей картинке видно что присваивание происходит по спаду импульса и это неблокирующее присваивание (что в прнинципе и так понятно), я спрашивал про результат присваивания, но тут, догадываюсь, будет результат сравнения, т.е. 0 или 1.

  12. #51
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,943

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Цитата Сообщение от vladsan75 Посмотреть сообщение
    Или там результат будет 0 или 1
    Да, все верно.
    Но у меня вроде был случай, когда такой код неправильно компилировался.
    Поэтому лучше прописывать явно, через тернарный оператор: rDSDEN <= (rBCNT<15) ? 1 : 0;

    Цитата Сообщение от vladsan75 Посмотреть сообщение
    И еще вопросик, чтобы добавить ассинхронный клок надо добавить вход, ну типа:
    input СCLK,
    а потом в обьявлении модуля CORE прописать:
    .iCCLK( СCLK ), // asyncronouse core clock
    ?
    Имеется ввиду добавить внешний асинхронный клок?
    Можно. Просто у новых FPGA генератор или ФАПЧ обычно есть внутри.
    Ну и даже если нет встроенного генератора достаточной частоты и нет ФАПЧ и тактовая частота генераторов 512Фс, то частоту клока для асинхронного входа можно удвоить логической схемой на триггере.
    Скважность такого клока будет кривая, но т.к. вся схема работает под одному фронту, то это не имеет значения.

  13. #52
    Частый гость Аватар для vladsan75
    Регистрация
    06.06.2010
    Адрес
    г.Саратов
    Возраст
    50
    Сообщений
    447

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    ФАПЧ конечно не плохо, но у нас меняется сетка частот - как на это реагирует модуль PLL? (который завязан на внешний клок)

    ---------- Сообщение добавлено 22:18 ---------- Предыдущее сообщение было 22:07 ----------

    Цитата Сообщение от dortonyan Посмотреть сообщение
    частоту клока для асинхронного входа можно удвоить логической схемой на триггере.
    Алексей, а не поделитесь схемкой, а то знаю удвоитель на исключающем или, а вот на триггере - поисковик молчит.

  14. #53
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,943

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Цитата Сообщение от vladsan75 Посмотреть сообщение
    ФАПЧ конечно не плохо, но у нас меняется сетка частот - как на это реагирует модуль PLL? (который завязан на внешний клок)
    Для умножения частоты точная частота источника не требуется. Для генераторов 512Fs можно задать среднюю частоту, например 23МГц с коэффициентом умножения 2.

    Цитата Сообщение от vladsan75 Посмотреть сообщение
    Алексей, а не поделитесь схемкой, а то знаю удвоитель на исключающем или, а вот на триггере - поисковик молчит.
    Примерно так:

    reg rMCK;
    wire wCK = rMCK ^ iCLK;
    always @ (posedge wCK) rMCK <= !rMCK;

    iCLK - входной клок, wCK - выход удвоенной частоты.

  15. #54
    Частый гость Аватар для vladsan75
    Регистрация
    06.06.2010
    Адрес
    г.Саратов
    Возраст
    50
    Сообщений
    447

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Цитата Сообщение от dortonyan Посмотреть сообщение

    reg rMCK;
    wire wCK = rMCK ^ iCLK;
    always @ (posedge wCK) rMCK <= !rMCK;

    iCLK - входной клок, wCK - выход удвоенной частоты.
    Не плохо, но получаются очень короткие импульсы, возможно придется несколько элементов включить последовательно, чтобы импульсы были подлиннее. Схемотехнически я это представляю, но как перевести в verilog...Но ведь никто не запрещает топ уровень сделать схемным файлом, и за одно там назначить все выводы.

  16. #55
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,943

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Цитата Сообщение от vladsan75 Посмотреть сообщение
    Не плохо, но получаются очень короткие импульсы, возможно придется несколько элементов включить последовательно, чтобы импульсы были подлиннее.
    1. Дополнительно включать ничего не надо. Внутри FPGA у всех триггеров время чтения гарантированно быстрее, чем обновление выхода. Поэтому ширина импульса будет достаточная для любого триггера.
    2. Ввести задержку все равно не получится, компилятор все лишнее вырежет. Если только как-то задать необходимую задержку через констрейнты. Но, опять же, в этом нет надобности. Работа такого удвоителя проверена на разных FPGA, нормально работает.

    Цитата Сообщение от vladsan75 Посмотреть сообщение
    Схемотехнически я это представляю, но как перевести в verilog..
    Ничего не понял. Я же и привел пример на верилоге.

    Цитата Сообщение от vladsan75 Посмотреть сообщение
    Но ведь никто не запрещает топ уровень сделать схемным файлом, и за одно там назначить все выводы.
    Без разницы как делать, схемой или описанием. Для компилятора это одно и то же.
    И все это очень условно, т.к. синтезатор все равно синтезирует свою эквивалентную схему.

  17. #56
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,730

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио


    Offтопик:
    dortonyan, Алексей, я случайно наткнулся на такую платку:
    https://www.wildberries.ru/catalog/3...x?targetUrl=EX
    как думаешь, можно ли её использовать для наших проектов? Тот проект считается открытым, значит схема на неё где-то есть.


    ---------- Сообщение добавлено 23:07 ---------- Предыдущее сообщение было 22:48 ----------

    Цитата Сообщение от dortonyan Посмотреть сообщение
    При желании можно в этом же проекте приподнять частоту ядра мегагерц до 70, увеличить длину фильтров, увеличить разрядности коэф-тов и накрутить параметры еще круче, с полным ослаблением на Fs/2.
    Ты такой вариант не пробовал? Покажешь?

    Наконец, вроде нашлось время попробовать и потестить DF3E.
    Последний раз редактировалось Turbo_man; 05.06.2025 в 23:20.

  18. #57
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,943

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Ты такой вариант не пробовал? Покажешь?
    Наконец, вроде нашлось время попробовать и потестить DF3E.
    А я больше этот проект не колупал. В принципе на практике хватает и того фильтра, что в нем уже есть. Пробовал на спектре гонять синус вблизи частоты Найквиста, алиясинга не видно.
    Еще круче - это больше из спортивного интереса, или ради перфекционизма.
    При желании сгенерировать более длинный фильтр можно и самостоятельно. Инструкция по генерации коэф-тов есть в DF2 проекте, здесь делается аналогично.
    Там только касяк с утилитой, которая конвертит матлабовские коэф-ты: c++ проект собран в исполняемый файл без подтяжки библиотек. Чтобы его запустить надо копировать на комп библиотеки gcc компилятора mingw64 и указывать к ним путь в переменных средах (mingw64/bin).
    Может когда-нить еще попробую пересобрать экзеху по нормальному, но пока не до этого.


    Offтопик:
    Цитата Сообщение от Turbo_man Посмотреть сообщение
    dortonyan, Алексей, я случайно наткнулся на такую платку:
    https://www.wildberries.ru/catalog/3...x?targetUrl=EX
    как думаешь, можно ли её использовать для наших проектов? Тот проект считается открытым, значит схема на неё где-то есть.
    Я даже не в курсе, что там за FPGA. И по моему это все избыточно, с новым DF3E проектом для стерео обработки хватает любого циклона, или говина.
    А для FIFO хватит и отдельной микросхемки SRAM, типа той, что была в вашем проекте.


  19. #58
    Завсегдатай Аватар для Михаил45
    Регистрация
    09.03.2007
    Адрес
    Санкт-Петербург
    Возраст
    63
    Сообщений
    2,183

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Алексей приветстую! Подскажи , пожалуйста, как поправить wck в spi_gen чтоб выполнялось условие для df1706 , с ним прекрасно работает pcm1702, у меня не получается для клока 1024.

    В принципе должно работать с module USAI_OUTPUT. Там очень похожа в симуляции wck. Попробую отттуда взять примеры.

    USAI_OUTPUT - отлично работает. Алексей спасибо, теперь и цап типа 1702 в работе с ДФ3 ( в т.ч. с конвертацией дсд-рсм) для коллекции. По аналогии , можно и другие файлы из прошлых ДФ подредактировать.
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	Снимок экрана 2025-06-10 075823.jpg 
Просмотров:	18 
Размер:	91.0 Кб 
ID:	474661  
    Последний раз редактировалось Михаил45; 10.06.2025 в 18:12.

  20. #59
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,943

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Михаил45, не за что.
    А зачем вообще используете модуль вывода из 1-го проекта? Он там не очень удачно сделан (громоздко).
    Единственное, ради чего он может понадобиться - это вывод с конвейеризацией. В остальных случаях лучше брать модули из DF3 или из DF2.

  21. #60
    Завсегдатай Аватар для Михаил45
    Регистрация
    09.03.2007
    Адрес
    Санкт-Петербург
    Возраст
    63
    Сообщений
    2,183

    По умолчанию Re: Экономичная реализация арифметики ЦОС в аудио

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Михаил45
    Единственное, ради чего он может понадобиться - это вывод с конвейеризацией.
    Только поэтому. ДФ3 вывод тоже можно с конвейером сделать, голова не доходит пока.

Страница 3 из 4 Первая 1234 Последняя

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •