2 votos

Desplazamiento de frecuencia

Estoy tratando de generar una señal que contenga sólo varias frecuencias específicas que conozco de antemano, alrededor de (16,4kHz, 16,7khZ, 17kHz,...)

la señal se genera mediante un microcontrolador, que luego emite una señal analógica a un altavoz.

El problema es que debido a las limitaciones de sincronización del chip, no puedo producir las frecuencias exactas que necesito, están desplazadas unos 40Hz en alguna dirección. Empiezo a pensar que quizás este método de generación no es el óptimo. mis preguntas son:

  1. ¿podría pensar en una forma diferente, tal vez incluso completamente analógica (sin microcontrolador) para generar este tipo de señal?

  2. Sé que para desplazar las frecuencias en, digamos, 40Hz, tengo que multiplicarlas por un coseno (modularlas), pero entonces se desplazarán tanto a la "izquierda" como a la "derecha", lo que hará que las cosas sean extremadamente incontinentes. ¿Hay alguna otra forma sofisticada de conseguir este tipo de desplazamiento de frecuencias?

Gracias.

EDITAR: Actualmente estoy usando microchip pic16F1783 @32MHz con DAC de 8 bits. Estoy creando una suma de los senos "puros" en las frecuencias deseadas y luego producir la onda. las limitaciones son del mundo digital: la frecuencia de muestreo se digitaliza, puede ser 8MHz / entero, digamos 8M/100 para obtener frecuencias de muestreo de 80KhZ. otra restricción es la RAM. Creo la señal por adelantado y la pongo en un array que no puede tener más de 450 elementos. Debido a todo esto mi señal no se crea a 16.4 sino a 16.351

4voto

Brian Drummond Puntos 27798

En principio, DDS debería ser fácil de lograr en el software - acumulador fraccional, a continuación, buscar seno o cos para cada tono que desea generar, a continuación, la suma. En un PIC, que va a ser un bucle apretado, sin embargo ...

Estoy asumiendo una LUT de 256 elementos que contiene un ciclo completo de una onda sinusoidal.

En cada periodo de muestreo, para cada frecuencia, añadimos una fracción a la posición de su puntero en la LUT, y tomamos la muestra en la parte (entera) de la posición. Para ilustrar lo sencillo que puede ser esto, he jugado con una hoja de cálculo:

Fs  =   80000   
Fout=   16400   16700   17000
Fout/Fs 0.205   0.20875 0.2125
*256    52.48   53.44   54.4
integer 52      53      54
rem     0.48    0.44    0.4
*256    122.88  112.64  102.4
rounded 123     113     102
actual  16400.146   16700.439   16999.511

La operación DDS real se traduce en pseudoensamblador (¡no en PIC!) como

add acc1L,123
adc acc1H,52
lookup LUT,acc1h
mov sum, lookup result

add acc2L,113
adc acc2H,53
lookup LUT,acc2h
add sum, lookup result

add acc3L,102
adc acc3H,54
lookup LUT,acc3h
add sum, lookup result

out DAC,sum
wait for next sample period

que se ampliará considerablemente con respecto a lo que recuerdo del lenguaje de ensamblaje del PIC, pero empieza a parecer factible.

Recuerde que los valores de la tabla de búsqueda deben ser escalados para que el resultado de la suma en "sum" no se desborde.

3voto

arclight Puntos 499

Utiliza un chip DDS (Síntesis Digital Directa). Analog Devices tiene algunos, por ejemplo.

Generalmente controlado por SPI o I2C, puedes configurar su frecuencia de salida utilizando tu microcontrolador.

Pero si quieres generar estas diferentes frecuencias al mismo tiempo en la misma señal, entonces un DDS no es el camino a seguir.

La forma más sencilla de hacerlo, es generar las diferentes señales, una a 16,4kHz, otra a 16,7khZ,... y sumarlas (no multiplicarlas) utilizando un OPAMP.

Puedes generarlos utilizando simples osciladores XTAL.

Otro método es calcular tu señal por adelantado. muestrearla a algo así como 20 veces la frecuencia más alta. Luego almacenas la muestra en una ram externa, flash o eeprom. Luego puedes utilizar un diseño lógico simple (discreto, CPLD, FPGA, etc.) para enviar la muestra a un DAC. No olvides filtrar la salida del DAC para eliminar el contenido de mayor frecuencia que aparece.

2voto

SandeepJ Puntos 1339

La respuesta de Blup1980 es buena, y bastante fácil (suponiendo que hayas hecho esto antes) de conseguir con una configuración FPGA/DAC, o un par de chips DDS.

En el frente del uC, hay DSPs con múltiples periféricos DAC que pueden valer la pena mirar, por ejemplo, el dsPIC33FJ64GP802 (y sus variantes) funciona a 40 MIPS, tiene un periférico DAC dual de 16 bits capaz de producir hasta 100kHz. También hay DSPs mucho más potentes, esto es sólo para reflexionar.

0voto

user13107 Puntos 313

Si este problema es simplemente una cuestión de que el almacenamiento de su LUT es demasiado pequeño, la solución simple es almacenar sólo un segmento de 90 grados de la forma de onda y luego obtener la muestra correcta a través de la indexación de compensaciones (Fase), inversiones de polaridad (cuadrante III y IV) y la dirección de conteo (Cuadrantes II, IV). Es importante que las muestras sean simétricas con respecto a la reflexión y que NO contengan "O" o picos (que se pueden insertar si es necesario).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X