Меню

Вывести с через частоту

Настройки вывода звука в Windows для ЦАПа NAD D 1050 и стриминга Tidal и Deezer

Не давно приобрел ЦАП NAD D 1050. Подключил через USB к ПК. Установил драйвера с официального сайта. На панеле ЦАПа отображается частота дискретизации.

Так вот, если Windows 8.1 в настройках аудио в свойствах динамиков установить формат 24 бит/48 кГц, то при проигрывании с Foobar, например, файла 16 бит/44,1 кГц, ЦАП показывает 48 кГц, а должен вроде как отображать точно какие данные передает без апсеплинга , т.е 44,1 кГц.

Ещё пример: устанавливаю также в свойствах аудио на ПК формат 24 бит/192 кГц . В Deezer стоит галочка на Flac по подписке Hi-Fi. Насколько мне известно на дизере Flac играет с частотой дискретизации 16 бит/44,1 кГц. Но ЦАП отображает, что играет якобы 192 кГц .

Т.е какое максимальное качество выставить в настройках винды, то и будет отображаться на ЦАПе при игре с Deezer и Foobar (в нем настройки никакие не трогал, всё по умолчанию).

Но если запускаю Tidal по подписке Hi-Fi, то ЦАП автоматом переходит на 44,1 кГц, т.е. показывает правильно, т.к. на Tidal качество Hi-F — это как раз FLAC 1411 кб\сек, что есть, если не ошибаюсь, как и на Deezer, — 16 бит/44,1 кГц.

При просмотре ТВ-каналов или стримингового сервиса FS через Xbox через PCM также включается индикатор 48 кГц , что думаю тоже близко к истине.

Вопрос, почему у Deezer и Foobar неправильно отображается частота дискретизации? Есть мысли, что тут задействуется как-то драйвер самой винды, может как-то его вообще исключить из работы — так будет правильно?

Слышал, что программа Audiorvana как раз блокирует все звуки и обработки во время проигрывания аудио через неё. Может Tidal тоже всё автоматом настраивает и поэтому отображение частоты дискретизации на ЦАПе соответствует действительности?

Кстати ещё, наверное, важный факт! На Tidal есть в настройках вывода звука 3 пункта:

1. Что то там по английски (использовать ваше оборудование, трали вали, действует только с подпиской Hi-Fi)

2. Нормализовать звук — ну это обычная глушилка по уровню

3. Перестать декодировать MQA . Если отключаю ползунок с первого пункта, то ЦАП начинает показывать 192 кГц (то есть как выставлено значение в Windows). Если же ползунок включаю, то на панели ЦАПа отображается 44,1 кГц. При этом звук вроде как тоже меняется, ещё не понял в какую сторону 🙂

Ещё вопрос, если у меня нет поддержки MQA, мне ползунок под номером 3 отключать или включать?

Источник

Генерирование и чтение сигналов

Начнём с самого простого: генерация импульса заданной длины, такое часто бывает нужно. Проще всего сделать это на delay() и delayMicroseconds() :

Нужно помнить, что digitalWrite() сам по себе выполняется в районе 3.6 мкс (58 тактов процессора). Для ускорения можно использовать например библиотеку directIO или прямую работу с регистрами портов.

Генерирование квадратного сигнала

Программное

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

Если заменить 1000 например на 10 , то получится квадратный сигнал с частотой 50 Гц. Этот способ называется программной генерацией сигнала, то есть микроконтроллер своими силами считает время и сам вручную дёргает ногой. Это как мешает работе остального кода, так и остальной код может сбивать частоту. Такую генерацию можно сделать более мене асинхронной на миллисе:

На практике такой способ используется редко, потому что на высокой частоте остальной код программы будет мешать генерации и частота будет плавать.

Функция tone()

В ядре Arduino есть встроенная функция для полуаппаратной генерации квадратного сигнала – tone(pin, frequency, duration) :

  • pin – цифровой пин, с которого будет генерироваться сигнал.
  • frequency – частота в Герцах. Диапазон 31.. 8’000’000 Гц, целые числа. С увеличением частоты растёт шаг изменения реальной частоты.
  • duration – продолжительность сигнала в миллисекундах. Опциональный параметр, если не указывать – сигнал будет генерироваться всё время.

Для ручной остановки генерации сигнала можно вызвать noTone() . Также у генерации при помощи tone() есть особенности:

  • Генерация является полуаппаратной: пин дёргается МК “вручную” по прерыванию таймера, что на высокой частоте может чуть тормозить код.
  • Генерация использует Timer 2, перенастройка или использование его для других целей (включая ШИМ на пинах D3 и D11 у Nano) отключит активную генерацию или изменит её частоту.
    • При вызове tone() таймер перенастраивается на генерацию, то есть можно использовать таймер в своих целях между вызовами tone() .
  • Генерация работает только на одном пине в один момент времени, причём для включения генерации на другом пине нужно сначала отключить текущую генерацию, то есть вызвать noTone() .

ШИМ сигнал

Аппаратный таймер позволяет генерировать квадратный сигнал аппаратно и полностью асинхронно работе остального кода, не тратя ни такта процессорного времени: время считается самим таймером, и сам же таймер управляет состоянием ноги МК. Для генерации ШИМ сигнала в среде Arduino есть функция analogWrite(pin, duty) , подробнее мы говорили в ней в уроке про ШИМ. Чтобы сделать ШИМ квадратным, нужно запустить его с duty , равной 128 . Что касается частоты полученного сигнала, то Ардуино настраивает таймеры так, что частота в зависимости от таймера может быть 490 или 980 Гц. Частоту можно изменить с довольно большим шагом, об этом мы говорили в уроке про увеличение частоты ШИМ.

Читайте также:  Как вывести дымоходную трубу через стену

Аппаратный таймер

Можно вручную настроить аппаратный таймер на генерацию квадратного сигнала. Тонкости настройки регистров таймера мы в рамках этих уроков не разбираем, но это можно сделать и при помощи библиотеки, например GyverTimers. Работу библиотеки мы разбирали в уроке о прерываниях таймера. Данная библиотека позволяет настроить генерацию квадратного сигнала с максимально возможной точностью и частотой, а также поднять на одном таймере генерацию двух или трёх (Arduino MEGA) меандров со смещением по фазе. Пример:

ШИМ сигнал

Аппаратный

Для генерации ШИМ сигнала с заданным заполнением есть стандартная функция analogWrite(pin, duty) , подробнее обсуждали в уроке про ШИМ сигнал, а частоту можно изменить перенастройкой таймера, как в уроке об увеличении частоты ШИМ. На самом деле таймеры позволяют настроить ШИМ сигнал с более точной или более высокой частотой и другими диапазонами заполнения (до 10 бит), но в ядре Arduino это не предусмотрено. Если такое будет нужно, можно воспользоваться библиотекой GyverPWM. Пример:

Программный ШИМ

Программная генерация ШИМ сигнала может пригодиться, если не хватает лишнего таймера или частота ШИМ низкая и не повлияет на остальной код, а он на неё. ШИМ сигнал на “миллисе” можно организовать вот таким образом, переключая выход по двум периодам:

Функцию PWMgen(заполнение) в данной реализации нужно вызывать как можно чаще в основном цикле программы:

Здесь мы на каждом вызове считаем новый период переключения, тратя на это какое-то время. Можно считать период в отдельной функции, а сам ШИМ генерировать отдельно. Реализацию можно посмотреть в библиотеке PWMrelay.

Полуаппаратный ШИМ

Можно снизить нагрузку на процессор, отдав счёт времени аппаратному таймеру. Примеры на базе GyverTimers (для ATmega328, 2560):

Как известно, digitalWrite() является очень тяжёлой и долгой функцией, и для генерации софт ШИМ рекомендуется заменить её чем-то более быстрым, например прямым обращением к регистру или вот такой конструкцией (для ATmega328p):

Если не хватает количества стандартных ШИМ-выходов, можно поднять полуаппаратный ШИМ на таймере на несколько пинов сразу:

Этот алгоритм является не самым оптимальным, более интересный можно посмотреть в GyverHacks.

Примечание: во всех трёх алгоритмах используется проверка совпадения со счётчиком counter == pwm_duty . Это сильно снижает использование процессорного времени в прерывании, но при резком уменьшении заполнения может приводить к одиночным “вспышкам” заполнения до максимума, так как условие не выполнится. Для более плавной работы можно сделать counter >= pwm_duty , тогда условие будет каждый раз “подстраиваться” под новое значение заполнения, но установка пина будет осуществляться на каждом тике!

Можно ввести буферизацию заполнения ШИМ и брать новое значение только при нулевом значении счётчика, это решит проблему:

Можно применить буферизацию и к остальным алгоритмам.

Библиотека Servo

Как известно, RC сервоприводы управляются при помощи ШИМ сигнала с частотой

50 Гц и длительностью импульса от

2500 микросекунд. В стандартной библиотеке Servo.h реализована генерация полуаппаратного ШИМ сигнала, причём количество пинов можно менять во время работы. Библиотеку можно использовать как генерацию ШИМ, если его параметры подходят для использования.

Чтение сигналов

Чтение цифрового сигнала сводится к измерению времени между его импульсами, то есть изменениями состояния HIGH-LOW: так можно измерить период и частоту квадратного сигнала, заполнение и частоту ШИМ и вообще любой другой сигнал.

Функция pulseIn()

В ядре Ардуино есть готовые функции для измерения импульсов:

    pulseIn(pin, value, timeout) – для импульсов от 10 мкс до

3 минут, работает на счёте тактов процессора, лучше работает при отключенных прерываниях, более точно измеряет короткие импульсы.
pulseInLong(pin, value, timeout) – для импульсов от 10 мкс до

3 минут, основано на micros() (т.е. на Таймере 0), не работает при отключенных прерываниях, более точно измеряет длинные импульсы.

Измеренная мной точность на коротких импульсах: 0.5 мкс

Обе функции возвращают длину импульса в микросекундах. Возвращают 0, если импульса не было и был достигнут тайм-аут. Обе функции блокирующие, то есть останавливают выполнение кода, пока не поймают импульс или не завершатся по тайм-ауту. Аргументы:

  • pin – цифровой пин (GPIO), на котором ожидается импульс.
  • value – направление импульса, HIGH или LOW .
  • timeout – тайм-аут ожидания импульса в микросекундах. Необязательный параметр, по умолчанию равен 1’000’000 мкс (1 секунда).

Как это работает: пусть мы настроили импульс на HIGH , функция будет ожидать изменение значения с LOW на HIGH . Если скачок с LOW на HIGH не произошёл за время, установленное тайм-аутом, функция завершит выполнение и вернёт 0.

Для превращения длины импульса (мкс) в частоту (Гц) достаточно поделить на него секунду (точнее, 1’000’000 мкс).

Измеряем сигналы вручную

Квадратный сигнал можно “измерить” вот таким образом:

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

Считаем импульсы и иногда делаем расчёт:

Также рассмотрим измерение параметров ШИМ сигнала, например на прерываниях и micros() :

Библиотека тахометра

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

“Запоминаем” сигнал

Также можно очень просто запомнить цифровой сигнал в Arduino для дальнейшего воспроизведения и исследования. Вот пример, который будет работать на любом пине (используется digitalRead() и micros()):

Измерение начнётся по изменению сигнала и продлится до тех пор, пока не переполнится буфер или работа не завершится по таймауту (в примере выше 1 секунда с последнего импульса). После этого в монитор порта будет выведен начальный уровень сигнала fval и тайминги каждого следующего фронта/спада (изменения). Для примера я подключил ИК приёмник и нажал кнопку на пульте:

Читайте также:  Как вывести перхоть быстро

Точность измерения должна быть около 5 мкс на AVR, так как используется тяжёлое чтение пина и микрос. Лучше переписать на прерывания по CHANGE и завести отдельный таймер, тогда точность можно повысить в сотни раз. Код не привожу, так как для разных платформ он будет разный.

Полученные данные можно использовать для анализа интерфейсов и протоколов, а также можно “воспроизвести” запись. В примере ниже я делаю это отдельным скетчем, вставив тайминги и начальное значение сигнала из лога предыдущего примера.

Для визуализации подключил дешёвый китайский логический анализатор (ссылка на али, ещё одна) на указанный пин:

Отлично! Прекрасно виден NEC протокол, его 4-х байтный пакет и код повтора.

Можно реализовать чтение пакета и его вывод в одной программе, запись дампа в EEPROM/SD для воспроизведения по кнопке и прочих сценариев работы, получив дубликатор цифрового сигнала.

Источник

Разбираемся с передачей видео в разрешении 4К на 60 Гц через хаб USB-C

USB-C предлагает новые потрясающие возможности, включая подключение внешних мониторов по USB-порту. Распространены недорогие конвертеры USB-C на DisplayPort и HDMI. Также часто встречаются хабы USB-C с поддержкой внешних мониторов, однако попытки разобраться в их возможностях и ограничениях могут сильно вас запутать. Некоторые из них совместимы с Mac, некоторые – нет. Некоторым нужны драйвера. Очень сильно разнится поддержка разрешений и частоты обновления. Некоторые рекламируются как «не предназначенные для игр». Делаются упоминания об альтернативных режимах, дуальных режимах, и прочем. Цены разнятся от $20 до $300+, причем функции у тех и других очень похожи. Что вообще происходит?

Это инструкция по передаче видео высокого разрешения по USB-C, которую я хотел бы в своё время иметь. Если вы хотите подключить монитор высокого разрешения к своему компьютеру, имеющему выход USB-C, читайте далее.

Забудьте про HDMI

В первую очередь необходимо сконцентрироваться на подключении к разъёму DisplayPort и забыть про HDMI. Вы не найдёте хаба USB-C, возможности которого с использованием порта HDMI превосходят возможности с использованием DisplayPort, однако же можно найти хабы, которые через DisplayPort предлагают большее разрешение и частоту обновления. Подозреваю, что большинство хабов с поддержкой HDMI внутри просто работают через DisplayPort и конвертер DisplayPort – HDMI. Всё оттого, что видео через DisplayPort на USB-C с одной и той же частотой и разрешением можно передавать более эффективно, чем через HDMI.

Коннекторы DualMode DisplayPort++ способны работать как коннекторы HDMI с простым пассивным адаптером (он преобразует 3,3 В в 5 В). Обычные коннекторы DisplayPort такого не умеют, и требуют активного HDMI-адаптера. Других отличий между двумя этими типами DisplayPort я не знаю.

Компромиссы по пропускной способности: всё дело в полосах

USB-C коннектор с 24 контактами является ключом к пониманию.

У коннекторов USB-C есть четыре дифференциальных разных пары, или «полосы», для передачи данных на высокой скорости. Есть и пятая пара, D+ и D-, передающая данные в старом стиле USB 2.0.

Посмотрим, что происходит при добавлении в эту кучу DisplayPort:

USB 3.1 Gen 2 использует только две из четырёх полос, как показано в двух верхних строках таблицы. Две остальные пропадают зря (их будет использовать USB 3.2). Две этих полосы можно переделать на поддержку родного сигнала DisplayPort, используя то, что называют DisplayPort Alternate Mode – это показано в средних строках. В данном случае коннектор USB-C работает как коннектор DisplayPort другой формы и дополнительными проводами для данных USB. Быстродействие USB 3.1 не теряет. Для компьютера и внешнего монитора это выглядит ровно как обычное соединение DisplayPort.

Две полосы DisplayPort обеспечивают достаточную пропускную способность для одного внешнего монитора разрешения до 4К и 30 Гц. Для фильмов сойдёт, но работать с десктопами Windows или MacOS на 30 Гц жестоко. Для поддержки частоты обновления в 60 Гц нужно уменьшить разрешение до 2К.

Если вам нужно 4К 60 Гц, 5К или несколько внешних мониторов, придётся использовать DisplayPort Alternate Mode со всеми четырьмя полосами для передачи данных DisplayPort, как показано в нижних строках таблицы. Для компьютера и внешнего монитора это всё ещё выглядит как обычное соединение DisplayPort. Однако для данных USB 3.1 полос уже не остаётся. Остаётся только старая пара D+/D-, обеспечивающая медленные данные USB 2.0. Это значит, что никакой USB-C хаб, использующий эту технологию для передачи видео 4К 60 Гц не может иметь портов USB 3.1.

Также можно поддерживать внешние мониторы с DisplayPort, не используя выделенных полос для DisplayPort Alternate Mode, и для этого есть два разных подхода. Если в порту USB-C компьютера есть поддержка Thunderbolt 3, тогда данные DisplayPort можно передавать внутри данных Thunderbolt. Тогда видеоданные становятся ещё одним типом макетов данных, уплотнённых вместе со всем остальным. У Thunderbolt 3 достаточно пропускной способности, чтобы таким способом поддерживать несколько соединений на 4К60, и ещё останется место для данных USB 3.1

Это круто, однако хабы для Thunderbolt 3 дороги, а у компьютера должна быть поддержка Thunderbolt 3, чего у многих нет. Также для компьютера это выглядит по-другому – в отличие от DisplayPort Alternate Mode, тут нет никаких родных сигналов DisplayPort и прямой связи с GPU компьютера. Не знаю, есть ли из-за этого задержка обработки видео, или это всё волшебным образом обрабатывается в чипсете без потери скорости. Полагаю, что потери нет.

Читайте также:  Чем чистить медный змеевик самогонного аппарата

DisplayLink

Другой способ поддержки внешних мониторов без выделения полос – DisplayLink. Эта технология сжимает видео на стороне хоста, отправляет его по USB 3.1 в виде данных общего назначения, и превращает обратно в видео на другом конце при помощи особого чипа типа DL-6950. Это похоже на доступ к экрану рабочего компьютера из дома по системе удалённого рабочего стола, только всё это происходит на одном вашем же рабочем столе.

DisplayLink хорошо подходит для запихивания видео высокого разрешения в низкоскоростное соединение типа USB, или поддержки нескольких внешних мониторов без использования Thunderbolt. Однако при наличии альтернатив лучше избегать DisplayLink. Вот его недостатки:

  • Требуется драйвер на стороне хоста. Доступность и совместимость драйверов для Mac/Linux практически нулевая. Поэтому некоторые хабы USB-C идут с пометкой о несовместимости с Mac.
  • Драйвер может замедлить работу компьютера. Он реализует поддержку виртуальной видеокарты, на лету сжимающей данные, что нагружает проц.
  • При большой занятости компьютера или изобилии трафика по USB на видео будут появляться артефакты. Пикселизация, задержки, выпадение кадров и другие проблемы. Поэтому некоторые USB-C хабы идут с пометкой «не для игр».

USB-C хабы с поддержкой DisplayLink фундаментально отличны от других, однако вы можете не понять этого из описания продуктов и технических спецификаций в магазинах. Если вы не знаете, что вам нужно, легко купить хаб с DisplayLink, даже не поняв этого, а потом страдать от его недостатков.

Так и какие у нас варианты?

Учитывая всё вышесказанной, можно разбить USB-C хабы на четыре категории на основании того, как они работают с видео. Вот примеры из каждой категории.

4 полосы для видео

Такие хабы поддерживают внешние мониторы вплоть до 4К60, или, возможно, 5К, но данные передают только по USB 2.0. Это не быстро, но достаточно для клавиатуры, мыши и простых принтеров. Должны работать на любом компьютере с поддержкой DisplayPort Alternate Mode, и стоят обычно порядка $30.

Cable Matters 201046 $38 – 1x DisplayPort, power, ethernet, 1x USB2
Cable Matters 201055 $58 – 2x DisplayPort, power, ethernet, 2x USB2
Monoprice 24274 $28 – 1x DisplayPort, power
Cable Matters 201026 $20 – 1x DisplayPort, power
Baseus B07P713FPD $25 – 1x DisplayPort, power

2 полосы для видео

Такие хабы поддерживают внешние мониторы вплоть до 4К30, и данные по USB 3.1. Многие из них рекламируются, как «4К», без указания частоты обновления. Должны работать на любом компьютере с поддержкой DisplayPort Alternate Mode, и стоят обычно порядка $30-$150.

HooToo HT-UC001 $34 – 1x HDMI, 3x USB3, power, card reader
OmniMaster B07KRMRJZD $55 – 1x HDMI, 1x mini DisplayPort, power, ethernet, 2x USB3, card reader, mic
Anker AK-A83310A1 $40 – 1x HDMI, 3x USB3, ethernet
Vava VA-UC006 $45 – 1x HDMI, 3x USB3 Ports, power, ethernet, card reader
StarTech DK30C2DAGPD $114 – 2x DisplayPort (switchable 2 or 4 lanes), power, ethernet, 2x USB2/3

0 полос для видео – DisplayLink

Такие хабы поддерживают внешние мониторы вплоть до 4К60, возможно и 5К, и данные по USB 3.1. Обычно они совместимы только с компьютерами под Windows, а не Mac или Linux, а также у них есть недостатки по быстродействию. Стоят они в районе $150-$200.
Plugable UD-3900 $89 – includes 1x HDMI, 1x DVI
Plugable UD-ULTC4K $193 – includes 2x DisplayPort, 1x HDMI
Plugable UD-6950H $149 – includes 2x DisplayPort, 2x HDMI
SIIG JUDK0811S1 $199 – includes 2x DisplayPort, 2x HDMI

0 полос для видео – Thunderbolt 3

Такие хабы поддерживают внешние мониторы вплоть до 4К60, возможно и 5К, и данные по USB 3.1. Должны работать на любом компьютере с поддержкой Thunderbolt 3. Это самый дорогой вариант, и стоят около $250 — $300.

OWC OWCTB3DK12PSG $249 – includes 1x mini DisplayPort, 1x Thunderbolt display
Plugable TBT3-UDV $249 – includes 1x DisplayPort, 1x Thunderbolt display
Cable Matters 107014 $239 – includes 1x HDMI, 1x Thunderbolt display
Kensington SD5200T $239 – includes 1x DisplayPort, 1x Thunderbolt display
Elgato 10DAA4101 $250 – includes 1x DisplayPort, 1x Thunderbolt display
Belkin F4U095tt $296 – includes 1x DisplayPort, 1x Thunderbolt display
CalDigit TS3 $310 – includes 1x DisplayPort, 1x Thunderbolt display

Врунишки

Наконец, интересная категория хабов USB-C малоизвестных брендов по цене в $30, заявляющих поддержку видео 4К60 и USB 3.1. Поищите на Amazon и найдёте множество таких. На основе полученых нами знаний о USB-C и DisplayPort мы уже знаем, что этого невозможно достичь без использования DisplayLink или Thunderbolt 3. Эти продукты откровенно врут насчёт своих возможностей! Скорее всего, они работают по схеме DisplayPort Alternate Mode и используют четыре полосы. У них могут быть синие порты с маркировкой USB 3.1, однако, как пишут во многих отзывах, реально они обеспечивают скорости USB 2.0.

Koopman B07J4XSSXV $24 – 1x HDMI, power, 1x USB
WBPINE HUB3-1 $20 – 1x HDMI, power, 1x USB
Koopman B07M5DMYKY $32 – 1x HDMI, power, 3x USB
NEWPOWER B07PQ5GZK1 $30 – 1x HDMI, power, 3x USB

А каков ваш опыт подключения внешних мониторов по USB-C?

Источник