MATLAB到Python代码转换(NumPy,SciPy,MatplotLib?)

Dav*_*boy 4 python matlab numpy matplotlib scipy

我正在尝试将以下代码从MATLAB转换为Python用于EEG项目(部分原因是因为Python稍微便宜了!)

希望有人可以指出我正确的方向:我已经开始改变它,但陷入困境:特别是试图找到相同的功能.

试过scipy.org(NumPy_for_Matlab_Users等),但我不确定我的论点是否是正确的格式/数字)

我最初使用的是pyserial

ser.read()
Run Code Online (Sandbox Code Playgroud)

要读取数据然后

ord()
Run Code Online (Sandbox Code Playgroud)

要将它转换为整数,但这个MATLAB代码以另一种方式('uchar')

我的主要问题是

fopen
fread
find
repmat
Run Code Online (Sandbox Code Playgroud)

整个绘图部分,因为我对Python中的内容更不了解(MatPlotLib?)

MATLAB也倾向于从'1'开始,而Python则使用0:我试图改变它们但是错过了一些我不确定的.

Python是否满意以冒号分隔的整个范围

...repmat(0:2:10, .....
Run Code Online (Sandbox Code Playgroud)

或不?

那么,这是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');
Run Code Online (Sandbox Code Playgroud)

这是我可怜的堂兄版

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')
Run Code Online (Sandbox Code Playgroud)

感谢所有建议!

戴夫!

And*_*gor 11

嗯......很多东西.

Python没有end关键字,因此您显然需要阅读有关Python语法的更多信息.

Python数组和切片使用[]not 索引().例如,范围表示为范围(0,10),但Matlab意义上的切片仅存在于像numpy这样的扩展包中,并且每个切片都有自己的接口.

是的,你想使用matplotlib绘图,它具有与Matlab绘图界面几乎相同的功能,至少在这个级别.

看起来你猜测Python在一些随机包中会有与Matlab相同的方法名称.这不是一个好计划.相反,在其文档中查找Matlab方法,该文档是在线的,确切地知道它的作用,然后阅读Python包文档以获得您想要的方法.这可能不存在,但我敢打赌,在一个程序中,这个简单,大多数你需要的程序.

在将任何Matlab代码转换为其他语言时,您需要了解的最重要的事情是Matlab数组的工作方式,这是非常不寻常的(但对于其目标应用程序来说非常好).Numpy具有相同的功能,但对他们来说却是完全不同的表示法.

串行模块已经在端口上为您提供了一个打开的文件对象,因此您不需要fopen.

我认为你需要花费很多时间来使用Python和Matlab的文档,因为很明显你现在也不懂.

不要让我气馁你,我只是诚实地对待你所处的位置.

  • 我完全赞同@Andrew McGregor.将程序从一个移植到另一个是一种很好的学习语言的方法(我现在正在从MATLAB到Python做类似的事情),但这是一种学习两种语言的难题! (3认同)

mtr*_*trw 5

一个小点 - 两者之间的索引是不同的.如果您只是将所有内容从MATLAB复制到Python,就像您似乎已经完成的那样,您会非常困惑.MATLAB x(1:5:end)转换为Python x [0 :: 5].返回NumPy for MATLAB Users并向下扫描到"Linear Algebra Equivalents"部分(大约在页面的一半).它提供了如何来回走动的字典.