2010-02-24 9 views
4

Je suis en train de convertir le code suivant à Python de MATLAB pour un EEG du projet (en partie parce que Python! Est un peu moins cher)Matlab à la conversion Python code (NumPy, SciPy, Matplotlib?)

Espérons que quelqu'un peut me diriger dans la bonne direction: j'ai commencé à le modifier mais je me suis enlisé: Essayant particulièrement de trouver des fonctions équivalentes.

Essayé scipy.org (NumPy_for_Matlab_Users etc.) mais je ne sais pas si mes arguments sont du format/nombre)

j'utilisais à l'origine pyserial

ser.read() 

Pour lire les données et puis

ord() 

Pour le convertir en un entier, mais ce code Matlab va à ce sujet une autre façon (« uchar »)

Mes principaux problèmes étaient avec

fopen 
fread 
find 
repmat 

Et toute la section traçante que j'ai encore moins d'une idée à ce sujet en Python (Matplotlib?)

Matlab a aussi tendance à commencer par « 1 » alors que Python utilise 0: J'ai essayé de les modifier aussi mais j'en ai raté quelques uns dont je n'étais pas sûr.

Python est-il satisfait de l'ensemble séparés par des virgules

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

ou non?

Alors, voici le 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'); 

Et voici ma pauvre version cousine

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') 

Toutes les suggestions reçues avec gratitude!

Dave!

+3

Il se peut que vous deviez poursuivre la traduction vers Octave, même Scilab. Puisque votre connaissance de Python est basique, vous ne perdrez probablement pas trop de temps à l'abandonner et à essayer autre chose. –

+0

@ H-gh-Performance Mark - Octave est-il compatible avec la communication série? – mtrw

Répondre

11

Um ... beaucoup de choses.

Python n'a pas de mot-clé end, vous devez donc en savoir plus sur la syntaxe de Python.

Les tableaux et les tranches Python sont indexés avec [] et non (). Les plages sont exprimées en tant que plage (0,10) par exemple, mais les tranches au sens de Matlab n'existent que dans des paquets d'extension comme numpy et chacun a sa propre interface.

Oui, vous voulez utiliser matplotlib pour le traçage, il a à peu près les mêmes capacités que l'interface de traçage de Matlab, au moins à ce niveau.

On dirait que vous devinez que Python aura les mêmes noms de méthodes que Matlab dans un paquet aléatoire. Ce n'est pas un bon plan. Au lieu de cela, recherchez la méthode Matlab dans sa documentation, qui est en ligne, découvrez exactement ce qu'elle fait, puis lisez dans la documentation du paquet Python une méthode qui fait ce que vous voulez. Cela peut ne pas exister, mais je parie que dans un programme aussi simple, la plupart de ceux dont vous avez besoin.La chose la plus importante que vous devez comprendre dans la conversion de n'importe quel code Matlab vers d'autres langages est le fonctionnement des tableaux Matlab, ce qui est extrêmement inhabituel (mais excellent pour ses applications cibles). Numpy a à peu près les mêmes capacités, mais une notation complètement différente pour eux.

Le module série vous a déjà donné un objet fichier ouvert sur le port, de sorte que vous n'avez pas besoin du fopen.

Je pense que vous avez besoin de passer beaucoup de temps avec la documentation pour Python et Matlab, car il est assez clair que vous ne comprenez pas pour le moment. Ne me laissez pas vous décourager, je suis juste honnête à propos de l'endroit où vous vous trouvez.

+3

Je suis totalement d'accord avec @Andrew McGregor. Portage d'un programme de l'un à l'autre est une bonne façon d'apprendre une langue (je fais quelque chose de similaire en ce moment de MATLAB à Python) mais c'est une manière difficile d'apprendre deux langues! – mtrw

+0

Comment cool un convertisseur open-source, automatique pour matlab en python être ?? – tylerthemiler

+0

@tylerthemiler: Assez cool http://ompc.juricap.com/ – endolith

2

Cela peut fonctionner ou non, mais vous pouvez essayer un convertisseur Matlab vers Python tel que mat2py. Je ne les ai jamais essayés, mais cela pourrait faire gagner du temps. En outre, il ya this page sur la conversion de Matlab en Numpy qui pourrait vous aider à se familiariser avec les différences entre les deux.

+0

Connexe: http://stackoverflow.com/questions/9845292/converting-matlab-to-python?rq=1 –

5

Un petit point - indexation entre les deux est différent. Si vous copiez simplement tout de MATLAB à Python, comme vous semblez l'avoir fait, vous serez très confus. MATLAB x (1: 5: end) se traduit par Python x [0 :: 5]. Revenez à NumPy for MATLAB Users et parcourez la section intitulée «Équivalents algébriques linéaires» (environ à mi-chemin de la page). Il donne un dictionnaire de comment aller et venir.

Questions connexes