2010-08-19 25 views
6

Estoy buscando un código simple (pseudo) que especifique el inverso de una señal de audio muestreada. Idealmente C++Cómo invertir el espectro de una señal de audio muestreada

El código debería admitir diferentes frecuencias de muestreo (16/32/48KHz).

+1

¿Qué es "spectrum-inverse"? Lo curioso es que google reveló tu pregunta aquí como primer golpe. ¿Desea el recíproco de fase y amplitud para cada frecuencia? ¿O simplemente quieres una IFFT? ¿O algo completamente diferente? – zerm

+0

Lo siento por mi vocabulario poco profesional: quiero que las bajas frecuencias se conviertan en las altas y viceversa (la compensación de CC se convertirá en un seno con la mitad de la frecuencia de muestreo). –

+1

Ahora tengo mucha curiosidad por saber cómo suena esto ... – PeterAllenWebb

Respuesta

6

Mezclando la señal por Fs/2 intercambiará frecuencias altas y bajas frecuencias - piense en girar el espectro alrededor del círculo unitario en medio giro. Puedes lograr esta rotación multiplicando cada otra muestra por -1.

Mezclar por Fs/2 es equivalente a mezclar por exp(j*pi*n). Si x es la entrada y la salida y,

y[n] = x[n] * exp(j*pi*n) = x[n] * [cos(pi*n) + j*sin(pi*n)] 

Esto simplifica fácilmente porque sin(pi*n) es 0, y cos(pi*n) es alterna 1, -1.

+0

Tan simple ... Increíble –

+2

Este truco se presenta mucho en DSP. Por ejemplo, si desea diseñar un filtro de paso alto, generalmente es más fácil diseñar un filtro de paso bajo con la proporción de corte deseada, luego gírelo alrededor del círculo de la unidad para hacer que pase alto. – mtrw

1

Con el fin de conseguir algo que tiene el mismo tipo de estructura temporal que el original, es necesario

  • Crear un espectrograma (con un poco de tamaño de la ventana)
  • recoger algunas límites de frecuencia superior e inferior que se se le da la vuelta a
  • voltear intensidades del espectrograma dentro de esos límites
  • resintetizar una señal de sonido compatible con esas frecuencias

Dado que es una señal de audio, no importa mucho que las fases se desordenen. Generalmente no puedes oírlos de todos modos. Excepto por la parte volteada, ARSS realiza la creación del espectrograma y la resíntesis del sonido.

De lo contrario, puede tomar una FFT, invertir las amplitudes de los componentes y tomar la FFT inversa. Pero eso será esencialmente absurdo, ya que acelerará por completo la estructura temporal del sonido y la estructura de frecuencia.

+0

Gracias, ARSS usa el banco de filtros de frecuencia, así que todo lo que puedo hacer es invertir los contenedores de frecuencia.Me pregunto si hay alguna manipulación matemática que invierta las frecuencias 'sin problemas' (sin dividirla en contenedores). –

+0

Puede usar wavelets que no están explícitamente agrupados, pero en su caso eso no importa. Los sonidos de baja frecuencia cambian mucho más lentamente que los de alta frecuencia, por lo que el flip va a alterar la suavidad de todos modos. –

0

no tiene mucho sentido usar un coseno. para una señal digital no es necesario ejecutar un ringmod real aquí, en nyquist un consine es un cuadrado de todos modos.

por lo que simplemente multiplicaría cada dos muestras por * -1 y habrá terminado.

sin latencia, sin alias, nada.

+0

Esto es lo que dice la respuesta aceptada. –