Sei sulla pagina 1di 11

ACOUSTIC TRACKER

PROFESOR: Víctor Ernesto Alonso Pérez

Ingeniería Económica
7 ’C’ Mecatrónica

luis perez
Integrantes
Luis Antonio Pérez Mogoyan
Myriam Palacios Castro
Lisset Flores Urbano
INDICE

1) Resumen

2) Marco Teórico.

3) Procedimiento

4) Resultados

5) Conclusiones
Resumen

En el siguiente documento se expondrá los procedimientos realizados para su


elaboración, así como la parte del código que se realizó en Matlab. También
realizamos unos circuitos para la adquisición de la señal acústica y se usaron
algunas tarjetas para la adquisición de la señal.

Marco Teórico.

Señal analógica.

Una señal analógica es un tipo de señal generada por algún tipo de fenómeno
electromagnético; que es representable por una función matemática continua en la
que es variable su amplitud y periodo (representando un dato de información) en
función del tiempo. Algunas magnitudes físicas comúnmente portadoras de una
señal de este tipo son eléctricas como la intensidad, la tensión y la potencia, pero
también pueden ser hidráulicas como la presión y térmicas como la temperatura.

En la naturaleza, el conjunto de señales que percibimos son analógicas, así la luz,


el sonido, la energía etc, son señales que tienen una variación continua. Incluso la
descomposición de la luz en el arco iris vemos como se realiza de una forma suave
y continúa.

Una onda sinusoidal es una señal analógica de una sola frecuencia. Los voltajes de
la voz y del video son señales analógicas que varían de acuerdo con el sonido o
variaciones de la luz que corresponden a la información que se está transmitiendo.

Correlación cruzada

En estadística, el término correlación cruzada a veces es usado para referirse a la


covarianza cov (X, Y) entre dos vectores aleatorios X e Y.

En procesamiento de señales, la correlación cruzada (o a veces denominada


"covarianza cruzada") es una medida de la similitud entre dos señales,
frecuentemente usada para encontrar características relevantes en una señal
desconocida por medio de la comparación con otra que sí se conoce. Es función del
tiempo relativo entre las señales, a veces también se la llama producto escalar
desplazado, y tiene aplicaciones en el reconocimiento de patrones y en
criptoanálisis.
Transformada rápida de Fourier (FFT)

La Transformada rápida de Fourier, conocida por la abreviatura FFT es un algoritmo


eficiente que permite calcular la transformada de Fourier discreta (DFT) y su inversa.

La FFT es de gran importancia en una amplia variedad de aplicaciones, desde el


tratamiento digital de señales y filtrado digital en general a la resolución de
ecuaciones en derivadas parciales o los algoritmos de multiplicación rápida de
grandes enteros.

Cuando se habla del tratamiento digital de señales, el algoritmo FFT impone algunas
limitaciones en la señal y en el espectro resultante ya que la señal muestreada y
que se va a transformar debe consistir de un número de muestras igual a una
potencia de dos.

La mayoría de los analizadores de FFT permiten la transformación de 512, 1024,


2048 o 4096 muestras. El rango de frecuencias cubierto por el análisis FFT depende
de la cantidad de muestras recogidas y de la proporción de muestreo.

La transformada rápida de Fourier es de importancia fundamental en el análisis


matemático y ha sido objeto de numerosos estudios. La aparición de un algoritmo
eficaz para esta operación fue un hito en la historia de la informática.

Procedimiento

Se realizo el algoritmo del proyecto en Matlab y LabVIEW para la ubicación de la


posición de los micrófonos se utilizaron funciones como las que son Xcross, FFT,
arcsen y entre otras para poder saber la ubicación en grados de los micrófonos.
2) En el código mostrado se utilizan dos señales senoidales, con un muestreo de
128, con una amplitud y fase distintas para poder encontrar el delay.

3) Después de eso ambas señales entran a una función cross correlation para poder
ver las diferencias entre ambas señales después de eso la salida entra en la FFT
de la señal.
4) Después de eso entra en una división entre la constante de la velocidad del
sonido entre el resultado de lo obtenido de la FFT

Resultados

Los resultados obtenidos variando la fase de las señales podemos observarlos en


las siguientes figuras del documento:

Desfasamiento de 90° con respecto a la primera señal.


Desfasamiento de 180° con respecto a la primera señal.

Código Matlab.
function proyectoV(fo)
filename='Digimon.wav'; %Nombre del archivo de sonido formato wav
(default: single tone)
if nargin==0
fo = 500;

elseif isstr(fo) && exist(fo,'Digimon.wav'); %Especificar el


nombre del archivo
filename=fo;

%Para saber la frecuencia fundamental. Se realiza un analisis


espectral
%del archivo utilizado.

[y,fs]=wavread(filename);
[Pxx,F]=psd(y(:,1),min([length(y) 1024*4]),fs);
[~,Max_ind] = max(Pxx);

if Max_ind<4 %Cualquiera de las primeras frecuencias


[~,Max_ind] = max(Pxx(4:end));
Max_ind=Max_ind+3;
end;
fo = F(Max_ind);
end;
%Mantener la ventana del seguidor para ver las señales.
set(0,'ShowHiddenHandles','on');
tracker_fig = findobj('Name','Tracker');
tracker_handles = guidata(tracker_fig);
has = tracker_handles.has;
set(0,'ShowHiddenHandles','off');
%Crea la figura
fh = figure();
h=msgbox([]);% Este comando sirve para posicionar los microfonos
waitfor(h)
% Obtenemos los datos cuando el microfono esta a la izquierda del otro
[data(1,:),trace]= LRetrieveData(fo,filename);
%Grafica los datos - top left of figure
time = linspace(0,1,length(trace));
subplot(4,3,1);
plot(time,trace(:,1));
ylabel('Left Mic');
title('Left Tone');
ax = axis;
subplot(4,3,4);
plot(time,trace(:,2));
ylabel('Right Mic');
xlabel('Time (s)');
axis(ax);
if data(1,1) < data(1,2) %Mics are switched
errordlg('Your mics are crossed. Please switch the left and right
mics.');
%close(fh)
return
end;
% Obten los datos cuando el microfono este a la derecha
[data(2,:),trace]=LRetrieveData(fo,filename);
%Grafica los datos - de la derecha
subplot(4,3,3);
plot(time,trace(:,1));
title('Right Tone');
axis(ax)
subplot(4,3,6);
plot(time,trace(:,2));
xlabel('Time (s)');
axis(ax);
% Obtenemos los datos cuando los microfonos estan en medio
[data(3,:), trace]=LRetrieveData(fo,filename);
%Grafica los datos - Microfonos en medio
subplot(4,3,2);
plot(time,trace(:,1));
title('Center Tone');
axis(ax)
subplot(4,3,5);
plot(time,trace(:,2));
xlabel('Time (s)');
axis(ax);
%Calibracion de los microfonos.
if 0
cal = data(3,:);
end;
cal = data([1 5]);
data(:,2) = data(:,2)*cal(1)/cal(2);
%Muestra 1/r la curva de datos
x=[0 .5 1]';
y = data([1 3 2],:);
if has.cfit %Usando el toolbox fitting

warning off %Oculta las advertencias de los puntos de inicio


LeftMic = fit(x,y(:,1),'rat01'); %rat01: rational, 0 order
num, 1st order den
RightMic = fit(x,flipud(y(:,2)),'rat01'); %Usa la misma 1/r.
warning on

%Imprime los valores de...


subplot(2,2,3);
plot(LeftMic,x,y(:,1));
legend('data','1/r fit')
ylabel('Left Mic');
subplot(2,2,4);
plot(RightMic,x,flipud(y(:,2)));
legend('data','1/r fit',2)
ylabel('Right Mic');
set(gca,'XDir','reverse');

else
%Graficar y = p1/(x+q1)
%Usar MATLAB polyfit:
% y = pl / (x + q1)
% y_inv = 1/y = (x + q1) / p1
% y_inv = (1/p1)*x^1 + (q1/p1)*x^0
% y_inv = c1*x^1 + c0*x^0
% then, p1 = 1/c1;
% q1 = co/c1;

C_Left = polyfit(x,1./y(:,1),1);
C_Right = polyfit(x,1./flipud(y(:,2)),1);
p1_Left = 1/C_Left(1);
q1_Left = C_Left(2) / C_Left(1);
p1_Right = 1/C_Right(1);
q1_Right = C_Right(2) / C_Right(1);

%Construye el microfono izquierdo, Estructura del microfono derecho


LeftMic.p1 = p1_Left;
LeftMic.q1 = q1_Left;
RightMic.p1 = p1_Right;
RightMic.q1 = q1_Right;

%Grafica los resultados anteriores.


x_fit = linspace(0,1);

LeftMic_fit = 1./polyval(C_Left,x_fit);
RightMic_fit = 1./polyval(C_Right,x_fit);

subplot(2,2,3);
plot(x,y(:,1),'r.',x_fit,LeftMic_fit,'b');
legend('data','1/r fit')
ylabel('Left Mic');
subplot(2,2,4);
plot(x,flipud(y(:,2)),'r.',x_fit,RightMic_fit,'b');
legend('data','1/r fit',2)
ylabel('Right Mic');
set(gca,'XDir','reverse');

end;
% Guarda los datos
save whereisitconfiguration data fo LeftMic RightMic cal filename
%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% LRetrieveData %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
function [magnitude,data]=LRetrieveData(msgString,msgTitle,fo,filename)

% Función para hacer un sonido, recuperar los datos de 1 segundo a dos


% micrófonos y luego determina la magnitud de los datos entrantes.
% Muestra un cuadro de mensaje para indicar al usuario dónde colocar el
altavoz
h=msgbox(msgString,msgTitle);
waitfor(h)
% Inicia el sonido
if exist(filename,'file')
makeasound(filename);
else
makeasound(fo);
end;
% Crea una entrada de 2 canales para despues configurarlos
% correlo por un segundo
AI=analoginput('winsound');
addchannel(AI,1:2);
AI.SampleRate=44100; % Hz
AI.SamplesPerTrigger=AI.SampleRate*2; % Corre durante 1 segundo
% Inicia el objeto y saca los datos de su búfer
% El objeto se detendrá automáticamente cuando haya adquirido el
% de número de muestras especificadas por SamplesPerTrigger arriba.
start(AI)
data=getdata(AI);
makeasound stop
delete(AI)
% Determine la magnitud del sonido pero solo mire los datos en el
% medio del conjunto de datos para que se eliminen todos los
transitorios.
range=length(data)/4:3/4*length(data);
magnitude = localRMS(data(range,1:2));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function out=localRMS(in,dim);
%RMS
[nr,nc]=size(in);
if nargin<1
help(mfilename);
elseif nargin<2
[junk,dim]=max([nr nc]);
end;
out=sqrt(mean(in.^2,dim));
Conclusión.

Como conclusión pudimos observar durante el desarrollo del proyecto que podemos
realizar un desfasado de dos señales para poder encontrar una posición optima
para le seguidor de sonido; esto dando un algoritmo para que se pueda posicionar
al ángulo mas favorable de donde le llega la señal.

Potrebbero piacerti anche