MATLAB a la conversión de código Python (NumPy, SciPy, MatplotLib?)

Estoy intentando convertir el siguiente código a Python desde MATLAB para un Proyecto EEG (¡en parte porque Python’s es un poco más barato!)

Ojalá alguien me pueda orientar en la dirección correcta: comencé a alterarlo, pero me quedé atascado: en particular, tratando de encontrar funciones equivalentes.

Probé scipy.org (NumPy_for_Matlab_Users, etc.) pero no estoy seguro de si mis argumentos son del formato / número correcto)

Originalmente estaba usando pyserial

ser.read() 

Para leer los datos en y luego

 ord() 

Para convertirlo en un entero, pero este código MATLAB lo hace de otra manera (‘uchar’)

Mis principales problemas fueron con

 fopen fread find repmat 

Y toda la sección de trazado, ya que tengo aún menos idea sobre eso en Python (MatPlotLib?)

MATLAB también tiende a comenzar con ‘1’, mientras que Python usa 0: también he intentado modificar estos, pero he perdido algunos de los que no estaba seguro.

Python está contento con toda la gama separada por dos puntos.

 ...repmat(0:2:10, ..... 

¿o no?

Entonces, aquí está el MATLAB:

 % EEG data grabber and plotter N = 256; % Required number of sample frames % Read in a block of data from the OpenEEG board hCom = serial('COM1','BaudRate',57600,'timeout',5); fopen(hCom); numBlocks = (ceil(17*N/256) + 1); rawdata = zeros(numBlocks*256,1); for n = 1:numBlocks rawdata((0:255) + n*256) = fread(hCom, 256, 'uchar'); % Read data end fclose(hCom); % Convert raw data into a Matlab matrix % First find the first frame start startIndex = find(rawdata == 165); while(rawdata(startIndex(1) + 1) ~= 90) startIndex = startIndex(2:end); end % Now extract the samples frameStarts = (0:(N-1))'*17 + startIndex(1); indices = 4 + repmat(frameStarts, 1, 6) + repmat(0:2:10, length(frameStarts), 1); eegData = (rawdata(indices)*256 + rawdata(indices + 1)) - 512; % eegData is now a N by 6 matrix, each column is a channel of sampled data % Plot time-series data figure(1) subplot(2,1,1) plot((0:255)/256,eegData(:,1:2)) xlabel('Time [s]'); ylabel('EEG data'); % Calculate FFT and plot spectra subplot(2,1,2) window = 0.5 - 0.5 * cos(2*pi*(0:255)/255); % Von-Hann Window f = abs(fft(repmat(window',1,2) .* eegData(:,1:2))); plot((0:127),f(1:128,:)) xlabel('Frequency [Hz]'); ylabel('EEG FFT'); 

Y aquí está mi pobre primo versión.

 import scipy import serial #Serial Module to read serial port from numpy import ceil,zeros #Ceil module & zeros for blank matrix N = 256 #no of sample frames (256 = 1s) #Reads a block of data from the serial port ser = serial.Serial('COM18',57600,timeout=5) scipy.fopen(ser) #MATLAB CODE: fopen(ser) is this correct???? numBlocks = (ceil(17*N/256) + 1) rawdata = scipy.zeros(numBlocks*256,1) for n = 1:numBlocks rawdata((0:255) + n*256) = numpyio.fread(ser,256,'i') # read each byte as unsigned integer end ser.close() #convert raw data to MATLAB matrix #find start of frame (1st Byte always 165, 2nd always 90) startIndex = find(rawdata == 165); while (rawdata(startIndex(0) + 1) ~=90) #confirms 165,90 sequence startIndex = startIndex(1:end) #uses rest of frame as data end #Extraction of sample values #MATLAB CODE frameStarts = (0: (N-1))'*17 + startIndex(1); #'#how to transpose matrix('): zip()?? indices = 4 + (numpy.tile(frameStarts, 1,6)) + (numpy.tile(0:2:10,length(frameStarts), 1); eegData = (rawdata(indices)*256 + rawdata(indices +1)) - 512 #values are unsigned integers 0-1023 and must subtract 512 for actual value #eeg data now N*6 Matrix each column is a channel of data #MATLAB CODE: plot time series data (MatPlotLib?) figure(1) subplot (2,1,1) plot((0:255)/256,eegData(:,1:2)) xlabel('Time [s]') ylabel('EEG Voltage') #fft subplot(2,1,2) window = 0.5 - 0.5*cos(2*pi*(0:255)/255); f = abs(fft(repmat(window',1,2) .* eegData(:,1:2))) '#repmat=tile()? matrix transposition (')? plot((0:127),f(1:128,:)) xlabel('Freq [Hz]') ylabel('EEG FFT') 

Todas las sugerencias recibidas con gratitud!

Dave!

Um … muchas cosas.

Python no tiene una palabra clave end , por lo que claramente necesita leer más sobre la syntax de Python.

Las matrices y segmentos de Python se indexan con [] no () . Los rangos se expresan como rango (0,10), por ejemplo, pero los segmentos en el sentido de Matlab solo existen en paquetes de extensión como numpy y cada uno tiene su propia interfaz.

Sí, desea utilizar matplotlib para trazar, tiene casi las mismas capacidades que la interfaz de trazado de Matlab, al menos en este nivel.

Parece que estás adivinando que Python tendrá los mismos nombres de métodos que Matlab en algún paquete aleatorio. Este no es un buen plan. En su lugar, busque el método Matlab en su documentación, que está en línea, averigüe exactamente qué hace y luego lea la documentación del paquete de Python para encontrar un método que haga lo que usted desea. Puede que esto no exista, pero apuesto a que en un progtwig tan simple, la mayoría de los que necesita lo harán.

Lo más importante que debe entender al convertir cualquier código de Matlab a otros idiomas es la forma en que funcionan los arreglos de Matlab, que es extremadamente inusual (pero excelente para sus aplicaciones de destino). Numpy tiene aproximadamente las mismas capacidades, pero una notación completamente diferente para ellos.

El módulo serie ya le ha proporcionado un objeto de archivo abierto en el puerto, por lo que no necesita el fopen.

Creo que necesitas pasar MUCHO tiempo con la documentación tanto de Python como de Matlab, porque está claro que no lo entiendes en este momento.

No me dejes desanimarte, solo estoy siendo honesto acerca de dónde estás.

Un pequeño punto: la indexación entre los dos es diferente. Si solo copia todo desde MATLAB a Python, como parece haber hecho, estará muy confundido. MATLAB x (1: 5: final) se traduce a Python x [0 :: 5]. Regrese a NumPy para usuarios de MATLAB y busque la sección llamada “Equivalentes de álgebra lineal” (aproximadamente a la mitad de la página). Da un diccionario de cómo ir y venir.

Esto puede o no funcionar, pero es posible que desee probar un convertidor de Matlab a Python como mat2py . Nunca los he probado, pero puede ahorrar algo de tiempo. Además, hay una página sobre la conversión de Matlab a Numpy que podría ayudarte a conocer las diferencias entre los dos.