Reproduzca PCM de 48 kHz en un receptor de 44.1 kHz

Tengo una transmisión PCM de 48 kHz y quiero transmitirla a un reproductor compatible de 44,1 kHz (AirPlay de Apple).

Alguien sabe si esto "simplemente funciona porque algunos bytes se perderían", o ¿tengo que hacer una conversión / muestreo anterior antes?

Si no "simplemente funciona", ¿algún consejo para hacer esto en Java?

EDITAR:

No solo funcionará porque el sonido tartamudeará ("desbordamiento de información"). Tengo que volver a muestrear / bajar la muestra del pcm-stream.

Debido a que esto no es tan trivial en este caso (48 kHz a 44.1 kHz), debería usar una biblioteca para hacer esto:

Creo que voy a probar la muestra libre. Como estoy en Android, podría usar la implementación nativa o la implementación de Java .

¿Crees que la implementación de Java es lo suficientemente eficiente?

Respuesta 1

El proceso necesario en su caso se llama "disminución de muestreo por un factor racional". No es un problema trivial, por lo que le sugiero que use una biblioteca para hacerlo; implementarlo usted mismo requiere mucho conocimiento de DSP. En su lugar, podría usar libreample, una biblioteca de C, para la cual tendría que escribir enlaces JNI.

Para hacer una aproximación muy aproximada, puede crear un nuevo búfer, en el que copie la mayoría de las muestras antiguas, pero descarte cada décima muestra. No será exactamente 44,1 kHz, pero será mejor que jugarlo tal como está.

Respuesta: 2

Ok, el enfoque más fácil es tomar cada 48/44.1muestra (lo cual es igual a sacar cada muestra 12). Eventualmente tendrás que hacer esto.

The problem with that is aliasing. If your downsampling, you are actually mirroring the spectrum outside of your downsampling rate into your samples (see this wiki page for a good explanation), which is called aliasing. You obviously don't want that (you can try it out and see, what happens with your audio).

So how can we prevent that? The most common way is to reduce the spectrum amplitude of those mirrored frequency chunks somehow. This way, they are mirrored, but it doesn't matter so much anymore, because their amplitude is very low. This can be done by using a lowpass filter with a cutoff frequency around your sampling ratio. So the steps would be:

  • Filtro de paso bajo de sus muestras para deshacerse de las amplitudes de alta frecuencia por encima de 44,1 kHz (tenga cuidado de no deshacerse de las cosas debajo de eso)
  • Submuestree sus datos (en su caso, expulse cada 12ª muestra)

¿Cuáles son los requisitos para ese filtro? Uno de los requisitos importantes es que no se deben tocar las amplitudes de frecuencia por debajo de la frecuencia de corte, por lo que sería muy bueno una ondulación de banda de paso muy baja y una ganancia de banda de paso de 1. Luego, la banda de detención debe humedecerse tanto como sea posible. Obviamente, esto depende de sus datos. No sé sobre el procesamiento de audio en especial, pero generalmente en DSP, los filtros de paso bajo que se usan son FIRo IIR. Por supuesto, hay muchos otros, pero estos son muy fáciles de implementar y, en cierta medida, incluso son capaces de manejar restricciones en tiempo real.

Por lo tanto, le sugiero que lea en estas dos implementaciones de filtro (o simplemente enfóquese FIR). Si está realmente confundido acerca de lo que acabo de escribir, entonces tal vez sea aún mejor usar una biblioteca determinada que tenga algún tipo de capacidad de filtrado de paso bajo. Pero si trabajas mucho con eso, te sugiero que leas el asunto, realmente ayuda a entender qué está pasando ...;)

Respuesta: 3

Tengo un andador como este: function: ^ (FUNCTION_TOK fcname = IDENTIFIER param = functionParameters *) {a_param_arrayList.add (param); }; functionParameters devuelve [Object sth]: ^ ...

En estos días, nos encontramos con un problema extraño, algunas de nuestras aplicaciones solr en tomcat con frecuencia caducan con una gran cantidad de conexiones. Hace varios días, agregamos el gc arg -XX: + ...

Estoy tratando de configurar Freemarker, pero para poder usarlo, instalé Ant (bin) e Ivy. Si escribo ant -version, todo parece estar bien, pero cada vez que escribo cualquier comando que involucre a ant, ...

Tengo una gran función JAVA no estática, que utiliza esta referencia en varios lugares dentro de ella. Quiero convertirlo en función estática y pasar "esta" referencia como parámetro, para poder tomarlo ...