MATLAB Code Python de conversion (NumPy, SciPy, MatplotLib?)
Je suis en train de convertir le code suivant à Python à partir de MATLAB pour un EEG Projet (en partie parce que Python est légèrement moins cher!)
J'espère que quelqu'un peut me pointer dans la bonne direction: j'ai commencé à le modifier, mais s'enlisait: en Particulier en essayant de trouver des fonctions équivalentes.
Essayé scipy.org (NumPy_for_Matlab_Users etc.) mais je ne sais pas si mes arguments sont de le droit format/nombre)
J'ai été à l'origine à l'aide de pyserial
ser.read()
Pour lire les données, puis
ord()
Pour la convertir en entier, mais ce code MATLAB y va d'une autre façon ('char')
Mes questions principales ont été avec
fopen
fread
find
repmat
Et l'ensemble du tracé de la section que j'ai encore moins d'une idée à ce sujet en Python (MatPlotLib?)
MATLAB a aussi tendance à commencer avec '1', tandis que Python utilise 0: j'ai essayé de modifier les présentes également, mais ont manqué un peu, je n'étais pas sûr de.
Python heureux avec l'ensemble de la plage, séparés par deux points
...repmat(0:2:10, .....
ou pas?
Donc, ici, c'est 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 mon cousin pauvre de la version
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!
Marque - t Octave ont de série support de communication?
OriginalL'auteur Davie_boy | 2010-02-24
Vous devez vous connecter pour publier un commentaire.
Euh... beaucoup de choses.
Python n'a pas de
end
mot-clé, de sorte que vous avez clairement besoin d'en lire plus à propos de Python syntaxe.Python tableaux et les tranches sont indexés avec
[]
pas()
. Les plages sont exprimés en gamme(0,10) par exemple, mais les morceaux dans le Matlab sens n'existent que dans les programmes de vulgarisation comme numpy et chacun a sa propre interface.Oui, vous voulez utiliser matplotlib pour le dessin, il a à peu près les mêmes capacités que Matlab de traçage, de l'interface, au moins à ce niveau.
Il semble que vous êtes deviner que Python ont les mêmes noms de méthode que Matlab dans certains aléatoire paquet. Ce n'est pas un bon plan. Au lieu de cela, regardez en haut de la Matlab méthode dans sa documentation, qui est en ligne, savoir exactement ce qu'il fait, et puis lire dans le paquet Python de la documentation pour une méthode qui fait ce que vous voulez. Cela peut ne pas exister, mais je parie que dans un programme aussi simple que cela, la plupart de ceux que vous avez besoin sera.
La chose la plus importante que vous devez comprendre, dans la conversion de tout code Matlab vers d'autres langues est la façon Matlab tableaux, ce qui est extrêmement rare (mais excellent pour ses applications cibles). Numpy a environ les mêmes capacités, mais complètement différent de notation pour eux.
Le numéro de série du module a déjà donné un ouvrir le fichier d'objet sur le port, de sorte que vous n'avez pas besoin de fopen.
Je pense que vous avez besoin de passer BEAUCOUP de temps avec la documentation de Python et Matlab, car il est assez clair que vous comprenez ni le moment.
Ne me laissez pas vous décourager, je vais être honnête au sujet de l'endroit où vous êtes.
Comment cool serait un open-source, auto convertisseur pour matlab, python??
Assez cool, ompc.juricap.com
Lol ouais, j'ai fini par googler qu'après la publication.
OriginalL'auteur Andrew McGregor
Un petit point d'indexation entre les deux est différent. Si vous venez de copier tout MATLAB, Python, comme vous semblez l'avoir fait, vous allez être très très confus. MATLAB x(1:5:à la fin) se traduit par Python x[0::5]. Revenir à NumPy pour les Utilisateurs de MATLAB et balayez vers le bas à la section intitulée "Algèbre Linéaire Équivalents" (environ à mi-chemin en bas de la page). Il donne un dictionnaire de la façon de faire l'aller-retour.
OriginalL'auteur mtrw
Cela peut ou peut ne pas fonctionner, mais vous voudrez peut-être essayer un Matlab, Python convertisseur tel que mat2py. Je n'ai jamais essayé, mais ça peut faire gagner du temps. Aussi, il y a cette page sur Matlab Numpy conversion qui peut vous aider à vous familiariser avec les différences entre les deux.
OriginalL'auteur Justin Peel