Страница 2 из 2 Первая 12
Показано с 21 по 30 из 30

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

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

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

    Просто 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 обработка выполняется сразу по приему данных одного канала: приняли левый - запустили обработку, приняли правый - запустили обработку.
    Данное обстоятельство накладывает ограничение на SPI фрейм, в котором сигнал 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; 09.02.2025 в 21:30.

  2. #21
    Частый гость Аватар для Кокон
    Регистрация
    12.06.2006
    Адрес
    Минск
    Сообщений
    496

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

    Alex, если на macos можно использовать то да.
    Здесь один делал клон такого транспорта и выкладывал даже на гитхаб.
    С маками затыки - по причине драйверов.

    По моим сведениям что многоканал Чид-а stm32 новой версии и данный транспорт имеет вопросы c macos .
    Если не имеет - то поправьте.

    Проект Gowin - это SoftPHY ?
    Tang 20k - один вопрос - кто будет бесплатно работать

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

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


    Offтопик:
    Цитата Сообщение от Кокон Посмотреть сообщение
    Alex, если на macos можно использовать то да.
    Здесь один делал клон такого транспорта и выкладывал даже на гитхаб.
    С маками затыки - по причине драйверов.

    Видимо там где-то есть некорректности в UAC2.
    У меня на XMOS работало под всем, включая Андроид и МакОс (правда у меня старый МакБук на Интеле, с Горным Львом).
    Но под МакОсью я пробовал только 2-х канальный, многоканал пробовал, только под Виндой и Андроидом.
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Да мне-то что, меняйтесь!"(с)анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

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

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

    Алексей приветствую! попытался добавить sai_out DF2, pll под 1541а, пока тишина, можешь подробнее рассказать о параметрах fir3 core.

    DF3 :



    Можно еще DSD_IN убрать, вообще ресурсов мало расходует.
    Последний раз редактировалось Михаил45; 09.02.2025 в 20:56.

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

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

    Михаил, лучше файлом вложите, чтобы такие портянки не постить.
    Не вижу где объявлено wire CLK. Компилятор ошибку не выдает, но проводника с клоком с выхода pll нету. Нужно дописать вверху.
    Еще касяк - в старый модуль параметр mck_mode() 1024 задавать нельзя, это только в 3-ем проекте.
    А в старом надо 0 или 1 (для 1024 вроде 0).

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

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

    Спасибо Алексей. Буду дальше смотреть.

    Хорошо. Сейчас уберу. Клок вот так записал:

    //input CLK,
    input clki,

    pll _pll(
    .inclk0(clki),
    .c0(CLK)
    );
    Последний раз редактировалось Михаил45; 09.02.2025 в 21:20.

  7. #26
    Завсегдатай Аватар для tomtit
    Регистрация
    23.06.2009
    Адрес
    пгт.Торонтовка
    Возраст
    66
    Сообщений
    1,026

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

    Я вот, подумал, что проматывать LFSR на 16, наверное не нужно. Как правильно сказал Е.Sokol - улучшить идеальное невозможно. IMHO, эти «общепринятые» улучшения - от математической неграмотности.
    Почему бы не сделать ДФ без экономии? Вроде несложно считать тап/клок, тогда получится максимальная длина КИХ 1024-OSR-1=1013, что более чем достаточно для OSR=8. Зато можно делать минимально-фазовые, да и вообще любые фильтры. Кстати,
    я стал применять только фильтры нечетного порядка, у них всегда нуль на найквисте.

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

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

    А как же межотсчетная корреляция значений мультибитного выхода LFSR?

    Михаил45, допишите еще декларацию для выходного проводника pll: "wire CLK;"

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

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

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

    Михаил45, допишите еще декларацию для выходного проводника pll: "wire CLK;"
    Ага. Прописал, завтра проверю работу.

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

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

    Цитата Сообщение от tomtit Посмотреть сообщение
    Почему бы не сделать ДФ без экономии?
    Алексей, я бы тоже не стал гнаться за минимальными ресурсами (скорее наоборот ). Лучше за качество DF биться или за расширените функционала. Платки на CycloneIV на 15К лутов не дефицит (я купил вариант и на 150К).

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

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

    Цитата Сообщение от tomtit Посмотреть сообщение
    Вроде несложно считать тап/клок
    Если есть выделенные блоки умножения. Но у совсем дешманских FPGA их может и не быть (либо быть, но недостаточно). Я на такие и ориентировался.

    Цитата Сообщение от tomtit Посмотреть сообщение
    Зато можно делать минимально-фазовые, да и вообще любые фильтры.
    Так и экономичный фильтр можно делать минимально-фазовым. Оба последних моих проекта имеют такую опцию.
    Для этого только первая ступень апсемплера делается минимально-фазовый, а остальные фазолинейные каскады на результат не влияют (ну или почти не влияют, по крайней мере отклик остается без предзвона).
    Умножение для экономии делаю за два такта. Получается, что за это время как раз можно читать два семпла для фазолинейного фильтра из RAM. А для несимметричных фильтров работает та же арифметика, только один такт чтения из двух память простаивает.

    Цитата Сообщение от tomtit Посмотреть сообщение
    Кстати,
    я стал применять только фильтры нечетного порядка, у них всегда нуль на найквисте.
    А я для нечетных фильтров использую погрешности квантования коэф-тов и опцию "Density Factor" в матлабе, с помощью которой подгоняю параметры так, чтобы получить нуль на Найквисте.
    Правда не всегда получается, но для большей части каскадов в 24-х битных коэф-тах удалось подобрать, что видно по частотным хар-кам DF3E (в архиве с проектом).

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Алексей, я бы тоже не стал гнаться за минимальными ресурсами (скорее наоборот ). Лучше за качество DF биться или за расширените функционала.
    Так а качественно улучшать уже давно нечего.
    Даже в экономичной реализации DF3E - это практически бескомпромиссный апсемплер: ослабление на Найквисте 55дБ, ослабление в полосе задержания более 120дБ, максимальная неравномерность в полосе пропускания около +/-0.000015дБ.
    При желании можно в этом же проекте приподнять частоту ядра мегагерц до 70, увеличить длину фильтров, увеличить разрядности коэф-тов и накрутить параметры еще круче, с полным ослаблением на Fs/2.
    Меньшее кол-во ресурсов - это не только экономия на ячейках, это еще и меньшее потребление и меньший уровень помех. Ну и выбор плисин в мелких корпусах больше, что тоже немаловажно (мелкие корпуса так же лучше в плане ЭМС).
    А лишние ресурсы не мешают.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    я купил вариант и на 150К
    А теперь прикиньте - какое будет потребление, если все эти 150к загрузить по максимуму.
    Там может еще и радиатор на чип понадобится.

Страница 2 из 2 Первая 12

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

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

Ваши права

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