Преобразование кода MATLAB в Python (NumPy, SciPy, MatplotLib?) - PullRequest
4 голосов
/ 24 февраля 2010

Я пытаюсь преобразовать следующий код в Python из MATLAB для проекта EEG (частично потому, что Python немного дешевле!)

Надеюсь, кто-то может направить меня в правильном направлении: я начал изменять его, но застрял: особенно пытаясь найти эквивалентные функции.

Пробовал scipy.org (NumPy_for_Matlab_Users и т. Д.), Но я не уверен, что мои аргументы имеют правильный формат / число)

Я изначально использовал pyserial

ser.read()

Чтобы прочитать данные, а затем

ord()

Чтобы преобразовать его в целое число, но этот код MATLAB идет другим путем ('uchar')

Мои основные проблемы были с

fopen
fread
find
repmat

И весь раздел прорисовки, поскольку у меня еще меньше идей об этом в Python (MatPlotLib?)

MATLAB также имеет тенденцию начинаться с '1', тогда как Python использует 0: я тоже пытался их изменить, но пропустил несколько, в которых я не был уверен.

Доволен ли Python всем диапазоном, разделенным двоеточиями

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

или нет?

Итак, вот 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');

А вот моя бедная версия двоюродного брата

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

Все предложения с благодарностью приняты!

Dave!

Ответы [ 3 ]

11 голосов
/ 24 февраля 2010

Эм ... много вещей.

В Python нет ключевого слова end, поэтому вам, безусловно, нужно больше узнать о синтаксисе Python.

Массивы и фрагменты Python индексируются с [], а не (). Например, диапазоны выражаются в виде диапазона (0,10), но срезы в смысле Matlab существуют только в пакетах расширений, таких как numpy, и каждый из них имеет свой собственный интерфейс.

Да, вы хотите использовать matplotlib для построения графиков, он имеет почти те же возможности, что и интерфейс построения графиков Matlab, по крайней мере, на этом уровне.

Похоже, вы предполагаете, что Python будет иметь те же имена методов, что и Matlab в некотором случайном пакете. Это не хороший план. Вместо этого посмотрите метод Matlab в его документации, которая находится в сети, выясните, что именно он делает, а затем прочитайте документацию пакета Python для метода, который делает то, что вам нужно. Это может не существовать, но я держу пари, что в программе это будет просто, большинство из тех, которые вам нужны, будут.

Самая важная вещь, которую вы должны понимать при преобразовании любого кода Matlab в другие языки, - это способ работы массивов Matlab, что крайне необычно (но отлично подходит для его целевых приложений). У Numpy примерно такие же возможности, но для них совершенно другое обозначение.

Последовательный модуль уже предоставил вам открытый файловый объект в порту, поэтому вам не нужен fopen.

Я думаю, вам нужно потратить МНОГО времени на документацию для Python и Matlab, потому что совершенно ясно, что вы не понимаете ни в данный момент.

Не позволяйте мне отговаривать вас, я просто честен в том, где вы находитесь.

5 голосов
/ 24 февраля 2010

Одна небольшая точка - индексация между ними различна. Если вы просто скопируете все из MATLAB в Python, как вы, кажется, сделали, вы будете очень сильно сбиты с толку. MATLAB x (1: 5: end) переводится в Python x [0 :: 5]. Вернитесь к NumPy для пользователей MATLAB и просмотрите раздел «Эквиваленты линейной алгебры» (примерно на половине страницы). Он дает словарь о том, как идти вперед и назад.

2 голосов
/ 24 февраля 2010

Это может или не может работать, но вы можете попробовать конвертер Matlab в Python, например mat2py . Я никогда не пробовал их, но это может сэкономить время. Также есть эта страница о преобразовании Matlab в Numpy, которая может помочь вам познакомиться с различиями между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...