MATLAB到Python代码的转换(NumPy,SciPy,MatplotLib?) [英] MATLAB to Python Code conversion (NumPy, SciPy, MatplotLib?)

查看:138
本文介绍了MATLAB到Python代码的转换(NumPy,SciPy,MatplotLib?)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to convert the following code to Python from MATLAB for an EEG Project (partly because Python's slightly cheaper!)

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

Hopefully someone can point me in the right direction: I've started to alter it but got bogged down: Particularly trying to find equivalent functions.

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

Tried scipy.org (NumPy_for_Matlab_Users etc.) but I'm not sure if my arguments are of the right format/number)

我最初使用的是pyserial

I was originally using pyserial

ser.read()

先读取数据,然后

ord()

将其转换为整数,但是此MATLAB代码以另一种方式('uchar')进行处理

To convert it into an integer, but this MATLAB code goes about it another way ('uchar')

我的主要问题是

fopen
fread
find
repmat

整个绘图部分,因为我对Python的了解甚少(MatPlotLib?)

And the whole plotting section as I have even less of an idea about that in Python (MatPlotLib?)

MATLAB也倾向于以'1'开头,而Python使用0:我也尝试过更改这些,但是错过了一些我不确定的地方.

MATLAB also tends to start with '1' whereas Python uses 0: I've tried to alter these also but have missed a few I wasn't sure of.

Python是否对用冒号分隔的整个范围感到满意

Is Python happy with the whole range separated by colons

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

还是不?

因此,这是MATLAB:

So, here is the 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')

感谢所有建议!

戴夫!

推荐答案

嗯...很多东西.

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

Python has no end keyword, so you clearly need to read more about Python's syntax.

Python数组和切片使用[]而不是()进行索引.例如,范围表示为range(0,10),但Matlab意义上的片仅存在于numpy之类的扩展包中,并且每个包都有其自己的接口.

Python arrays and slices are indexed with [] not (). Ranges are expressed as range(0,10) for example, but slices in the Matlab sense only exist in extension packages like numpy and each one has its own interface.

是的,您想使用matplotlib进行绘图,至少在此级别上它具有与Matlab的绘图界面几乎相同的功能.

Yes, you want to use matplotlib for plotting, it has pretty much the same capabilities as Matlab's plotting interface, at least at this level.

您似乎在猜测Python在某些随机包中将具有与Matlab相同的方法名称.这不是一个好计划.取而代之的是,在其在线文档中查找Matlab方法,确切地了解其功能,然后阅读Python软件包文档中的方法来实现所需的功能.这可能不存在,但是我敢打赌,在一个程序中,您将需要如此简单的大多数程序.

It looks like you're guessing that Python will have the same method names as Matlab in some random package. This is not a good plan. Instead, look up the Matlab method in its documentation, which is online, find out exactly what it does, and then read into the Python package documentation for a method that does what you want. This may not exist, but I'm betting that in a program this simple, most of the ones you need will.

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

The most important thing you need to understand in converting any Matlab code to other languages is the way Matlab arrays work, which is extremely unusual (but excellent for its target applications). Numpy has about the same capabilities, but a completely different notation for them.

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

The serial module has already given you an open file object on the port, so you don't need the fopen.

我认为您需要花费大量时间来编写Python和Matlab的文档,因为很显然您目前还不了解.

I think you need to spend a LOT of time with the documentation for both Python and Matlab, because it's quite clear you understand neither at the moment.

别让我灰心,你只是在说实话.

Don't let me discourage you, I'm just being honest about where you're at.

这篇关于MATLAB到Python代码的转换(NumPy,SciPy,MatplotLib?)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆