【问题标题】:MATLAB to Python Code conversion (NumPy, SciPy, MatplotLib?)MATLAB 到 Python 代码转换(NumPy、SciPy、MatplotLib?)
【发布时间】:2011-01-20 13:43:36
【问题描述】:

我正在尝试将以下代码从 MATLAB 转换为 Python 用于 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')

感谢所有建议!

戴夫!

【问题讨论】:

  • 您可能会进一步翻译到 Octave,甚至是 Scilab。由于您的 Python 知识是基础知识,因此您可能不会放弃太多放弃它并尝试其他东西。
  • @H-gh-Performance Mark - Octave 是否支持串行通信?

标签: python matlab numpy matplotlib scipy


【解决方案1】:

嗯...很多东西。

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

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

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

您似乎在猜测 Python 将在某个随机包中具有与 Matlab 相同的方法名称。这不是一个好计划。相反,请在其在线文档中查找 Matlab 方法,确切了解它的作用,然后阅读 Python 包文档以找到可以满足您要求的方法。这可能不存在,但我敢打赌,在这么简单的程序中,您需要的大多数程序都会存在。

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

串口模块已经在端口上给了你一个打开的文件对象,所以你不需要fopen。

我认为您需要花大量时间阅读 Python 和 Matlab 的文档,因为很明显您目前两者都不了解。

别让我气馁,我只是诚实地告诉你你的处境。

【讨论】:

  • 我完全同意@Andrew McGregor 的观点。将程序从一种语言移植到另一种语言是学习一门语言的好方法(我现在正在做类似的事情,从 MATLAB 到 Python),但这是学习两种语言的艰难方法!
  • 一个开源的matlab到python的自动转换器会有多酷??
  • 大声笑,是的,我在发布后最终在谷歌上搜索。
【解决方案2】:

一个小点 - 两者之间的索引是不同的。如果您只是将所有内容从 MATLAB 复制到 Python,就像您所做的那样,您会非常困惑。 MATLAB x(1:5:end) 转换为 Python x[0::5]。返回NumPy for MATLAB Users 并向下扫描到名为“线性代数等效项”的部分(大约在页面的一半处)。它提供了一本关于如何来回移动的字典。

【讨论】:

    【解决方案3】:

    这可能有效,也可能无效,但您可能想尝试使用 Matlab 到 Python 转换器,例如 mat2py。我从未尝试过它们,但它可能会节省一些时间。此外,还有关于 Matlab 到 Numpy 转换的 this page 可能会帮助您熟悉两者之间的差异。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 2011-12-07
    • 2014-01-23
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多