2010-10-07 16 views
31

Se ha descubierto que Dell Streak tiene una radio FM que tiene controles muy toscos. 'Escaneo' no está disponible por defecto, así que mi pregunta es si alguien sabe cómo, usando Java en Android, uno podría 'escuchar' la radio FM mientras iteramos por el rango de frecuencias detectando ruido blanco (o una buena señal) para para actuar como una función de búsqueda de radio normal?¿Se puede detectar el ruido blanco mediante programación?

+0

Tengo una Dell Streak y tengo herramientas de Android instaladas. Dame me gusta si necesitas un beta tester para cualquier cosa :-) – CiscoIPPhone

Respuesta

15

He hecho algunos trabajos prácticos en esta área específica, recomendaría (si tiene poco tiempo para ello) probar un poco de experimentación antes de recurrir a fft'ing. La secuencia de pcm se puede interpretar de forma muy compleja y sutil (según el filtrado y el remuestreo de alta calidad) pero también se puede tratar prácticamente para muchos fines como la ruta de una línea ondulada.

El ruido blanco es agitación impredecible de la línea, que nunca es de los de menos bastante continua en intensidad (rms, media absoluta ..) contenido acústico es wiggling recurrente y sorpresas ocasionales (saltos, salta):]

El contenido no sonoro de una señal se puede estimar realizando cálculos rápidos en una ventana en ejecución de la secuencia pcm.

Por ejemplo, el ruido tenderá a tener un valor más alto para la integral absoluta de su derivada, que el no ruido. Creo que es la forma académica de decir esto:

loop(n+1 to n.length) 
{ sumd0+= abs(pcm[n]); 
    sumd1+= abs(pcm[n]-pcm[n-1]); 
} 

wNoiseRatio = ?0.8; //quite easily discovered, bit tricky to calculate. 

if((sumd1/sumd0)<wNoiseRatio) 
{ /*not like noise*/ } 

Asimismo, el promedio absoluta corriendo sobre ~ 16 a ~ 30 muestras de ruido blanco tenderán a variar menos, sobre el ruido blanco de la señal acústica:

loop(n+24 to n.length-16) 
{ runAbsAve1 += abs(pcm[n]) - abs(pcm[n-24]); } 

loop(n+24+16 to n.length) 
{ runAbsAve2 += abs(pcm[n]) - abs(pcm[n-24]); } 

unusualDif= 5; //a factor. tighter values for longer measures. 

if(abs(runAbsAve1-runAbsAve2)>(runAbsAve1+runAbsAve2)/(2*unusualDif)) 
{ /*not like noise*/ } 

Esto se refiere a cómo el ruido blanco tiende a ser no esporádico en un tramo lo suficientemente grande como para promediar su entropía. El contenido acústico es esporádico (potencia localizada) y recurrente (potencia repetitiva). La prueba simple reacciona al contenido acústico con frecuencias más bajas y podría ser ahogada por el contenido de alta frecuencia. Hay filtros de paso bajo simples que pueden ayudar (y sin duda otras adaptaciones).

Además, el cuadrado medio de la raíz se puede dividir por la suma absoluta media que proporciona otra proporción que debe ser particular al ruido blanco, aunque no puedo imaginar lo que es ahora. La relación también será diferente para las señales derivadas también.

Creo que estas son simples firmas de ruido formuladas. Estoy seguro de que hay más ... Lamento no ser más específico, es un consejo difuso e impreciso, pero también lo es realizar pruebas simples a la salida de un fft.Para una mejor explicación y más ideas, tal vez revise las medidas estadísticas y estocásticas (?) De entropía y aleatoriedad en la wikipedia, etc.

+0

+1 Creo que es la solución más fácil y más eficaz. Al derivarse, de hecho detectará la naturaleza aleatoria del ruido. Y funciona incluso con un tiempo de muestreo corto, lo que significa un escaneo rápido. –

+0

Debe ser un buen punto porque mi explicación fue/es muy desordenada. Intenté arreglarlo un poco. – strainer

+0

Gracias por esto: la observación a continuación acerca de que Android no tiene acceso a API podría ser (y probablemente sea) un obstáculo, pero si tengo acceso, probablemente adopte este método. –

3

Para la detección de ruido blanco necesita hacer FFT y ver que tiene espectro más o menos continuo. Pero grabar desde FM podría ser un problema.

14

Utilice una transformada rápida de Fourier.

Esto es lo que puede usar una Transformada de Fourier rápida para. Analiza la señal y determina la intensidad de la señal en varias frecuencias. Si hay un pico en la curva de FFT, debería indicar que la señal no es simplemente ruido blanco.

Here es una biblioteca que admite FFT. Además, here es un blog con código fuente en caso de que quiera aprender sobre lo que hace la FFT.

+0

¿Cuántos milisegundos de audio necesitas recolectar antes de poder aplicar una FFT utilizable? –

+0

Usted está hablando aquí sobre la señal EM que obtendría. FFT puede ayudar, pero PLL sería mejor. Desafortunadamente no tiene esa señal ... – BenoitParis

+0

Cualquier tamaño de ventana FFT de más de 32 muestras dará valores perfectamente utilizables para probar la falta de ruido (32 instancias son suficientes para que la entropía del ruido blanco promedie en comparación con los detalles acústicos). Yo recomendaría hacer fffs escasamente, alrededor de una décima parte de la señal completa y mantener la ventana por debajo de 200 muestras, evitará demandas de procesamiento inútiles y, por cierto, no elimina los sonidos de tipo localizado/de percusión en una medida demasiado larga. – strainer

7

Si usted no tiene las herramientas FFT disponibles, sólo una sugerencia salvaje:
intenta compresa unos pocos milisegundos de audio.

Una característica típica del ruido es que comprime mucho menos que la señal clara.

+1

Esa es una forma interesante de hacerlo, pero tengo dudas ... ¿podría reconocer un canal que tenía poca cantidad de ruido? También sería muy dependiente del algoritmo de compresión utilizado, ¿qué sería un buen algoritmo? – CiscoIPPhone

+0

Eso es realmente una sugerencia salvaje. ¿Piensa en compresión sin pérdida (zip) o compresión de audio como mp3 u ogg? –

+0

¡Extremadamente salvaje! Estaba pensando en algo como zip, pero ahora que dices esto, mp3/ogg es una idea muy interesante, más cercana a hacer una FFT en realidad. –

1

¿Tiene una suscripción a la biblioteca IEEE Xplore? Hay innumerables artículos (one escogidos al azar) sobre este mismo tema.

Un método muy simple sería observar la "planeidad" de la potencia spectral density. Uno podría tomar esto usando un Fast Fourier Transform de la señal en el dominio del tiempo y encontrar el standard deviation de la densidad espectral. Si está por debajo de un umbral, tiene su ruido blanco.

0

La pregunta principal aquí es: ¿a qué tipo de señal tiene acceso?

Apuesto a que no tiene acceso directo a la señal analógica EM directamente. Entonces, no es posible usar FFT en esta señal. Tampoco puede intentar construir un phased-lock loop, que es la forma en que funciona su sintonizador de radio antiguo estándar ("Escaneo" en su caso).

Su única opción es elegir una frecuencia y escucharla también (e intente detectar cuando es ruido con FFT en el sonido). Incluso puede que solo tenga acceso a la señal FFTed.

Problema aquí: Si desea detectar una frecuencia potencial utilizando ruido blanco, captará las señales con demasiada facilidad.


De todos modos, aquí es lo que me gustaría tratar de hacer con esta estrategia:

doble integrar el autocorrelation del spectral density durante una fracción de segundo de audio. Y esto para cada frecuencia.

A continuación, busque la frecuencia de FM donde este número se maximiza.

pequeña explicación aquí:

  • densidad espectral que da una señal que están al máximo las frecuencias más utilizadas.
  • Si un poco más tarde si se alcanzan las mismas frecuencias, entonces tiene un sonido supuestamente claro. Usted obtiene esto integrando la autocorrelación de la densidad espectral para una frecuencia de audio por una fracción de segundo (usando alguna función que crezca más que lineal también podría funcionar)
  • Usted solo tiene que integrar esto para todas las frecuencias de audio

También tenga cuidado de normalizar las integrales: una señal de ruido blanco fuerte no debe obtener una puntuación más alta que una señal de audio clara pero baja.

+0

La compresión también podría ayudar (¿quizás resten recursos?) – BenoitParis

5

Por lo que sé, no hay API o incluso controladores para la Radio FM en el Android SDK y, a menos que Dell lance uno, tendrá que hacer la suya. En realidad es incluso peor que eso. Todo (?) Nuevo chipsets tiene Radio FM pero not all phones tiene FM Radio application.

El antiguo Windows Mobile tenía el mismo problem.

0

Varias personas han mencionado la FFT, lo que usted querrá hacer, pero para detectar ruido blanco usted necesita asegurarse de que la magnitud sea relativamente constante en el rango de las frecuencias de audio. Querrá ver solo las magnitudes, puede descartar las fases. Puede calcular una desviación promedio y estándar para las magnitudes en O (N) tiempo. Para el ruido blanco, debe encontrar que la desviación estándar es una fracción relativamente pequeña del promedio. Si recuerdo bien mis estadísticas, deberían ser aproximadamente (1/sqrt (N)) del promedio.

2

El filtro de paso alto le dará una buena idea, y algunas veces se ha usado para silenciar las radios fm.

Tenga en cuenta que esto es comparable a lo que obtenía la sugerencia de derivada: tomar la derivada es una forma simple de filtro de paso alto, y tomar el valor absoluto de esa forma cruda de medir la potencia.

Cuestiones relacionadas