Воспроизведение 48 кГц PCM на приемнике 44,1 кГц

У меня есть поток PCM 48 кГц, и я хочу передать его на проигрыватель, совместимый с частотой 44,1 кГц (Apple AirPlay).

Кто-то знает, работает ли это «просто потому, что некоторые байты будут потеряны», или мне нужно сделать преобразование/понижающую выборку раньше?

Если это не «просто работает», какие-нибудь советы по этому поводу в java?

РЕДАКТИРОВАТЬ:

Это просто не сработает, потому что звук будет заикаться («переполнение информации»). Я должен передискретизировать / понижать дискретизацию PCM-потока.

Поскольку в данном случае это не так тривиально (от 48 кГц до 44,1 кГц), я должен использовать для этого библиотеку:

Думаю попробовать libresample. Поскольку я работаю на Android, я мог бы использовать собственную реализацию или реализация Java.

Считаете ли вы, что java-реализация достаточно производительна?


person Martin L.    schedule 19.06.2012    source источник


Ответы (3)


Процесс, необходимый в вашем случае, называется «понижение дискретизации по рациональному фактору». Это нетривиальная проблема, поэтому я предлагаю вам использовать для этого библиотеку - для самостоятельной реализации требуется много знаний DSP. Вместо этого вы могли бы использовать libresample, библиотеку C, для которой вам пришлось бы писать привязки JNI.

Чтобы сделать очень грубое приближение, вы можете просто создать новый буфер, в который вы скопируете большинство старых сэмплов, но отбросите каждый 10-й сэмпл. Это будет не совсем 44,1 кГц, но лучше, чем играть как есть.

person timos    schedule 19.06.2012

Хорошо, самый простой подход — взять каждый 48/44.1th сэмпл (что эквивалентно удалению каждого 12-го семпла). В конце концов вам придется это сделать.

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

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

  • Фильтр нижних частот ваших сэмплов, чтобы избавиться от высокочастотных амплитуд выше 44,1 кГц (будьте осторожны, чтобы не избавиться от того, что ниже)
  • Подвыборка ваших данных (в вашем случае отбрасывайте каждую 12-ю выборку)

Итак, каковы требования к этому фильтру? Одним из важных требований является то, что амплитуды частот ниже вашей частоты среза не должны затрагиваться, поэтому было бы неплохо иметь очень низкую пульсацию в полосе пропускания и коэффициент усиления в полосе пропускания, равный 1. Затем следует максимально демпфировать полосу заграждения. Очевидно, это зависит от ваших данных. Я ничего не знаю об обработке звука, но обычно в DSP используются фильтры нижних частот FIR или IIR. Конечно, есть много других, но они очень просты в реализации и в определенной степени даже способны обрабатывать ограничения в реальном времени.

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

person brimborium    schedule 20.06.2012

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

Тогда вам нужно сделать даунсэмплинг по рациональному коэффициенту. В Интернете есть много статей об этих двух процессах. Так что, если вы действительно справитесь с этой задачей, проведите небольшое исследование.

Например. один простой подход к фильтру нижних частот заключается в использовании среднего значения двух выборок в качестве выходной выборки. То есть y(n)=(x(n)+x(n-1))/2; где y - выход и x - вход, n - текущая позиция выборки.

person avepr    schedule 20.06.2012