Как отключить фильтрацию высоких частот веб-аудиоанализатором

Я изучаю аудио API html5. Я заметил, что модуль анализа имеет проблемы с обработкой высоких частот. Как будто в нем есть встроенный фильтр. Например, если я испускаю тон 20 кГц и отображаю результат getFloatFrequencyData, я вижу следующий спектр: введите здесь описание изображения Однако, если я использую Audacity, тот же сигнал выглядит так: (обратите внимание на пик @ 20 кГц) введите описание изображения здесь

Можно ли отключить встроенный фильтр модели анализа? p.s. частота дискретизации достаточно высока в соответствии с холстом контекста, поэтому я не заподозрил бы проблем с наложением имен.


person Hanan Shteingart    schedule 09.07.2015    source источник
comment
Обновление: попытался использовать пользовательский scriptNode и построить его БПФ с помощью dsp.js, и все же я получаю эту фильтрацию, которую обычное приложение для записи не видит.   -  person Hanan Shteingart    schedule 11.07.2015
comment
Был ли этот график сгенерирован с микрофона iPhone? Я получаю аналогичный профиль с iPhone, но «плоский» с Samsung.   -  person daniel sp    schedule 09.06.2020


Ответы (3)


У @cwilso есть это, вход фильтруется по умолчанию, вам нужно передать правильно сформированный объект ограничений в getUserMedia. Формат немного неудобный, но это неизбежно, учитывая его компетенцию. Спецификация еще не полностью реализована всеми, и каждый браузер имеет свой собственный набор недокументированных препроцессоров с префиксом. Это то, что я использовал, чтобы получить самый необработанный звук (середина октября 2016 г.). Этот список, вероятно, тоже неполный - я пока смотрел только на FF и Ch. У кого-нибудь есть другие?

let constraints = {
  audio: {
    optional: [
      {echoCancellation: false},
      {mozAutoGainControl: false},
      {mozNoiseSuppression: false},
      {googEchoCancellation: false},
      {googAutoGainControl: false},
      {googNoiseSuppression: false},
      {googHighpassFilter: false}
    ]
  }
};

let mediaInput = navigator.mediaDevices.getUserMedia( constraints );
person Roger Heathcote    schedule 17.10.2016

Обновление 2018 г.: Chrome больше не нуждается в префиксе goog, а фильтр высоких частот больше не используется (я проверил это на звуковой карте, поддерживающей входы постоянного тока):

let constraints = {
  audio: {
    echoCancellation: false,
    autoGainControl: false,
    noiseSuppression: false
  }
};

let mediaInput = navigator.mediaDevices.getUserMedia( constraints );
person aandroyd    schedule 11.07.2018

Похоже, вы используете аудиовход (например, микрофон)? Если это так, убедитесь, что вы отключили эхокомпенсацию — передайте объект ограничения в getUserMedia с эхокомпенсацией, установленной на false, а-ля https://github.com/cwilso/Audio-Input-Effects/blob/master/js/effects.js#L52-L57 и https://github.com/cwilso/Audio-Input-Effects/blob/master/js/effects.js#L160-L163. В противном случае встроенная обработка лишает некоторых вещей, в том числе высоких частот.

person cwilso    schedule 09.07.2015
comment
Спасибо, но это не помогло. navigator.getUserMedia( // ограничения - для этого приложения требуется только звук { audio : true, echoCancellation : false }, - person Hanan Shteingart; 10.07.2015
comment
Полный пример фрагмента был бы действительно полезен. - person Raymond Toy; 14.07.2015