Una breve discusión sobre la aplicación de MATLAB en el análisis de señales y sistemas. Cómo escribir el artículo.

Artículos relacionados:

Cómo usar la caja de herramientas de Matlab para el procesamiento de señales digitales en Vc++

Resumen: este artículo detalla cómo usar la caja de herramientas de Matlab en Vc entorno Para el procesamiento de señales digitales, el texto completo toma como ejemplo la función de análisis de densidad espectral de potencia en la caja de herramientas de Matlab e introduce la llamada de las funciones de la caja de herramientas a través del propio motor de Matlab, el propio compilador de Matlab y el uso de Matcom de la empresa MathTools.

Palabras clave: Compilador del motor de archivos M de Matlab Matcom Vc++

La caja de herramientas de procesamiento de señales de Matlab es una colección de archivos de algoritmos de señales. Los objetos básicos que procesa son señales y sistemas. se encuentra en el directorio Toolbox\Signal. Los archivos de la caja de herramientas se pueden utilizar para realizar transformación de señales, filtrado, estimación de espectro, diseño de filtros, etc. Si puede llamar archivos en la caja de herramientas de Matlab en otros entornos como Vc, acelerará enormemente la implementación de algunos algoritmos y su confiabilidad también será alta.

Uso del motor Matlab

El motor Matlab adopta métodos informáticos de cliente y servidor. En la aplicación, el programa en lenguaje C o C++ de VC sirve como cliente front-end, que transmite. comandos al motor Matlab e información de datos, y recibe información de datos del motor Matlab. Proporciona las siguientes funciones: engOpen, engGetArray, engPutArray, engEvaString,

engOutputBuffer, engClose para interactuar con el cliente.

La siguiente rutina consiste en crear una aplicación basada en diálogos en Vc, configurar un control de botón OnMatlabEngine en el cuadro de diálogo y agregar "engine.h" y "math" al archivo cuadro de diálogo.cpp. h", a continuación se proporciona una lista parcial de programas.

Void CtestmatlabDlg::OnMatlabEngine(){

Motor *ep;

mxArray* T=NULL,*result=NULL,*mFs=NULL,* mnfft= NULL;

datos doblesx[1024];

búfer de caracteres[1024];

for(int j=0;j<1024;j++) //Nota: si los datos se recopilan a través de la tarjeta de adquisición, los datos recopilados se pueden colocar en la matriz datax[] y este bucle no es necesario

{

double samt =(doble)( 1.0/1024);

datax[j]=sin(2.0*63.0*samt*3.1415926+1.15*3.1415926);

}

double *pPxx ,*pFxx;

if(!(ep=engOpen(" \0"))){//Abra el motor Matlab y establezca una conexión con el Matlab local

fprintf(stderr, "\n No se puede iniciar el motor MATLAB\n");

exit(-1);

}

doble Fs[1]={1024 };//Debido a que todos los parámetros involucrados en las operaciones de Matlab están en forma matricial, las siguientes líneas convierten los parámetros

double nfft[1]={1024};// en un forma matricial aceptable para Matlab.

T=mxCreateDoubleMatrix(1,1024,mxREAL);

mnfft=mxCreateDoubleMatrix(1,1,mxREAL);

mFs=mxCreateDoubleMatrix(1,1 ,mxREAL);

mxSetName(T,"T");

mxSetName(mnfft,"mnfft");

mxSetName(mFs,"mFs" );

memcpy((char*)mxGetPr(T),(char*)datax, 1024*sizeof(double));

memcpy((char*)mxGetPr(mnfft ),(char*)nfft, sizeof(double));

memcpy((char*)mxGetPr(mFs),(char*)Fs,1*sizeof(double));

engPutArray(ep,T); //Coloca los parámetros convertidos en el motor. Este parámetro se puede ver en la ventana de comandos de Matlab

engPutArray(ep,mnfft). >engPutArray(ep,mFs);

engEvalString(ep,"[pxx,fo]=psd(T,mnfft,mFs);"); //Usa el motor para ejecutar los archivos en la caja de herramientas.

engOutputBuffer(ep,buffer,512); //Si solo desea ver los gráficos mostrados, puede eliminar los parámetros de retorno. Si psd no tiene parámetros de retorno, los gráficos se animarán automáticamente de forma predeterminada.

result =engGetArray(ep,"pxx");//Extrae los datos del motor y colócalos en el área puntiaguda para su posterior procesamiento

pPxx=mxGetPr(result);

resultado= engGetArray(ep,"fo");

pFxx=mxGetPr(resultado);

engEvalString(ep,"plot(fo,10* log10(pxx));"); //Usa el motor para hacer dibujos

engEvalString(ep,"title('Análisis del espectro de energía');");

engEvalString( ep,"xlabel('Hz');") ;

engEvalString(ep,"ylable('db');");

mxDestroyArray(T); memoria

mxDestroyArray(mFs);

mxDestroyArray(mnfft);

mxDestroyArray(resultado);

engEvalString(ep,"close ;");

engClose (ep);

}

Para compilar el programa anterior en Vc, necesita usar los siguientes comandos para los dos dinámicos. bibliotecas libeng.dll y libmx.dll:

lib/def:e:\Matlab\extern\include\*.def /machine:ix86 /out: *.lib para generar las bibliotecas de enlaces estáticos libeng.lib y libeng.lib requeridas por el programa libmx.lib, simplemente agregue los directorios donde se encuentran libeng.lib y libmx.lib en los módulos de proyecto/enlace/objeto/biblioteca de Vc++.

Utilice el propio compilador de Matlab para llamar funciones en la caja de herramientas

El compilador de Matlab puede convertir los archivos M de Matlab en código fuente C o C++ para producir un Matlab completamente independiente. Una aplicación independiente en el entorno de ejecución. , Pero los propios datos de Matlab muestran que si el compilador se usa para crear una aplicación independiente, no puede llamar a funciones en la caja de herramientas de Matlab, lo cual es muy desfavorable para desarrollar algunos algoritmos especiales. He estudiado durante un tiempo y descubrí que, dado que las funciones en la caja de herramientas son archivos M, se pueden compilar con un compilador para proporcionar funciones de llamada como Vc. Sin embargo, el compilador solo puede compilar un archivo M independiente, es decir, este. El archivo M no puede Depende de otros archivos M. Si se llaman otros archivos M en el archivo M, el archivo M llamado se puede copiar a la ubicación correspondiente del archivo M que llama y se puede usar para la compilación del compilador realizando los cambios apropiados. El compilador no admite funciones gráficas, por lo que si hay funciones gráficas en el archivo M, es necesario comentarlas.

Cuando el compilador mcc de Matlab agrega los parámetros apropiados -e (mcc -e *.*) o -p (mcc -p *.*), puede generar el archivo M de entrada y convertirlo en Aplicación- código fuente específico C o C++. De esta manera, si desea compilarlo en Vc, debe conectar las siguientes bibliotecas libmmfile.dll, libmatlb.dll, libmcc.dll, libmat.dll mibut.dll y la biblioteca Matlab C MATH. Se recomienda utilizar el método mencionado anteriormente para cambiar la conexión dinámica a la conexión estática. Para configurar el entorno de compilación C/C++, ejecute mex –setup en la ventana de comandos de Matlab y siga las instrucciones. Para configurar el entorno de conexión C/C++, ejecute mbuild –setup y siga las instrucciones.

A continuación se muestra cómo utilizar el compilador para generar funciones que Vc puede llamar desde el archivo psd.m en la caja de herramientas de Matlab.

Copie el archivo psd.m al directorio Matlab\bin y reescriba los archivos M llamados correspondientes, como nargchk.m, hanning.m, etc. Para que el código generado sea conciso, se pueden realizar una gran cantidad de eliminaciones cuando los parámetros de entrada del procesamiento de datos de recopilación sean claros y, finalmente, hacer de psd.m un archivo M independiente que no dependa de otros archivos M. para comentar el dibujo. El código finalmente se cambió al siguiente formato y los pasos clave se dan debido a limitaciones de espacio:

función [Pxx,f]=psd(Fs,nfft,noverlap,x. )

ventana= o,5*(1-cos(2*pi*(1:nfft)'/(nffft+1)));//ventana de hanning

dflag ='none';

window=window(;)

……………………………….

Puedes completar lo anterior siempre que tenga un poco de conocimiento del lenguaje Matlab y del procesamiento de señales.

Supongamos que el código anterior se vuelve a guardar como testwin.m, configure los parámetros del entorno en la ventana de comandos de Matlab y ejecute mcc -e testwin, luego testwin.c se puede generar en Matlab\bin, como como ejecutar mcc -p testwin Luego genere testwin.cpp

Cree un archivo basado en diálogo en Vc y luego agregue un control de botón OnButtonPsd en el cuadro de diálogo

Agregue el archivo de encabezado. del archivo .c generado anteriormente Vaya al .cpp del proyecto y agregue #ifdef_cplusplus

extern "c"{

#end if

declaración de código c al archivo de inclusión Vc y generar entre los archivos de inclusión .C

Se #ifdef_cplusplus

}

#end si se agrega al final del Archivo .cpp

Para que sea simple y fácil de procesar, cambie ligeramente la función c generada y proporcione parte del código de la siguiente manera:

void CTestpsdwinDlg::OnButtonPsd(){

mxArray* x_rhs_;//puntos al área de almacenamiento de datos de recopilación

Fs=23510;//frecuencia de recopilación de datos nfft=1024;//fft de 1024 puntos

datos doblesx[1024]//datos recopilados

x_rhs_mxCreateDoubleMatrix(1,1024,mxReal);

memcpy(mxGetPr(x_rhs_),datax,1024*sizeof(double)) ;

noverlap=512;

……………….

……………….

mccCopy(&Pxx ,&Spec);

mccCopy(&f,&frevgg_vector );

for(int j=0;j<(int)(nfft/2+1);j++)

{

datap[j] =mccGetRealVectorElement(&Pxx, (j+1));//La densidad del espectro de potencia se almacena en la matriz datap[]

dataf [j]=mccGetRealVectorElement(&f, (j+1));//La frecuencia correspondiente almacenada en los datos de la matrizf[]

}

mccFreeMatrix(&Pxx);

……………….

SendMessageBox( WM_PAINT,0,0);//Utilice la función de gráficos en Vc para dibujar imágenes

Regresar;

}

El programa generado arriba no es muy legible y el código C++ generado es más legible, pero asegúrese de usar solo la biblioteca MATH de Matlab, no la biblioteca MATH de C++; de lo contrario, Se producirán errores de compilación, que no se describirán aquí debido a limitaciones de espacio.

3) Utilice Matcom para llamar funciones en la caja de herramientas

Matcom compila el archivo M Primero, traduce el archivo M al código fuente cpp de acuerdo con la relación correspondiente con la biblioteca cpp de Matcom. y luego use La versión correspondiente del compilador de c compila el archivo cpp en el archivo exe o dll correspondiente, por lo que se debe especificar la ruta al compilador de c para la primera ejecución; de lo contrario, no se puede compilar. Matcom\bin\matcom.ini, pero cuando instala matcom en este paso, automáticamente encuentra el compilador y lo escribe en el archivo matcom.ini. Matcom versión 4.5 usa el control OCX TeeChart3.0, por lo que admite operaciones gráficas.

Seguimos usando el archivo testwin.m anterior, no comentamos las funciones gráficas y usamos Mideva para generar un controlador de señal que puede ser llamado por Vc.

Ejecute Mideva para abrir el archivo M directamente en la interfaz principal, seleccione compilar en dll en el menú, ingrese testwin. Puede encontrar varios archivos de este tipo en el directorio de depuración de Matcom, testwin.c, testwin. h, testwin.cpp, testwin.lib, testwin.dll, testwin.exp, etc.

Agregue el testwin.cpp y testwin.h anteriores al proyecto, proyecte/agregue al proyecto/archivos y agregue "stdafx.h" al archivo correspondiente.

Agregue la biblioteca de conexión : Herramientas\opción\directorio\, seleccione la opción de inclusión, agregue e:\matcom45\lib (incluido matcom.h)

Opción de biblioteca, agregue e:\matcom45\lib

4) La opción de tipo de archivo Project\add to project\files selecciona (.lib) y agrega e:\matcom45\lib\v4501.lib al proyecto para compilarlo y ejecutarlo. El código correspondiente es el siguiente:

void CtestmatcomDlg::OnpsdButton(){

double datap[512],dataf[512];

initM(MATCOM_VERSION );/ /Inicializar biblioteca matcom

Mm Fs,nfft,noverlap;//Crear matriz

Mm x=zeros(1,1024);

Fs =1024; nfft=1024;noverlap=128;

dMm(Pxx_o);dMm(f_o);//Crear y nombrar la matriz

datax[];//Los datos recopilado se almacena en En esta matriz

for(int i=1;i<=1024;i++)

{

x.r(1,i)= datax[i+ 1];//Asigna un valor a la matriz x

}

testwin(Fs,nfft,noverlap,x,i_o,Pxx,f_o);//función generado por matcom

for(i=0;i<513;i++){//Obtener los resultados del análisis de densidad espectral de potencia

dataf[i]=f_o.r(i+ 1,1);

datap[i]=Pxx_o.r(i+1,1);}

salirM();

regresar;

}

Se puede ver que es muy fácil usar Matcom para convertir archivos M y el código generado es muy legible. La conversión anterior también genera una biblioteca de enlaces dinámicos que puede. ser llamado por Vc. Su uso es el mismo que el de una biblioteca dinámica general. Al mismo tiempo, cabe señalar que Matcom no solo puede convertir archivos M independientes que no dependen de otros archivos M, sino también convertir archivos M anidados que llaman a otros archivos M. La condición es que estos archivos M estén en el mismo directorio. El psd.m mencionado anteriormente se puede convertir directamente usando el método anterior, generando múltiples formas sobrecargadas de funciones psd.

Conclusión: use el motor Mtlab para llamar. Las funciones de la caja de herramientas pueden ahorrar muchos recursos del sistema y el rendimiento general de la aplicación es mejor, pero no se pueden ejecutar sin el entorno Matlab. Para utilizar el compilador Matlab para llamar a funciones de la caja de herramientas, el archivo M correspondiente debe convertirse en un archivo M independiente. Las funciones gráficas no son compatibles y la legibilidad del código convertido no es muy buena. La conversión con Matcom es muy conveniente, el código generado es muy legible, admite funciones gráficas y la velocidad de ejecución del código es en promedio más de 1,5 veces más rápida que sin conversión.

El programa anterior se ha depurado en Vc++ 6.0, Matlab5.2 y Matcom4.5. El método anterior se ha utilizado bien en la práctica de la ingeniería.

Solo como referencia, aprenda de usted mismo

Espero que le resulte útil