我正在尝试将以下代码从EEG项目的MATLAB转换为Python(部分原因是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');


这是我可怜的堂兄版本。

戴夫!

评论

您可能会进一步翻译成Octave,甚至是Scilab。由于您的Python知识是基础知识,因此您可能不会放弃过多地放弃它并尝试其他尝试。

@ H-gh-Performance Mark-Octave是否支持串行通讯?

#1 楼

嗯...很多东西。

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

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

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

您似乎在猜测Python在某些随机包中将具有与Matlab相同的方法名称。这不是一个好计划。取而代之的是,在在线的文档中查找Matlab方法,确切地了解其功能,然后阅读Python软件包文档中的方法来实现所需的功能。这可能不存在,但是我敢打赌,在一个程序中,这种简单的大多数需求将是您所需要的。 Matlab阵列的工作方式,这是非常不寻常的(但对于其目标应用而言却非常出色)。 Numpy具有几乎相同的功能,但功能却完全不同。

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

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

不要让我灰心,我只是对您的所在地诚实。

评论


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

–mtrw
2010-2-24在19:44

用于Matlab到python的开源自动转换器有多酷?

– tylerthemiler
2012年1月26日,0:11

大声笑是的,我在发帖后最终对其进行了谷歌搜索。

– tylerthemiler
2012年5月30日在21:02

#2 楼

一个小问题-两者之间的索引编制是不同的。如果您只是将所有内容从MATLAB复制到Python,就像您已经做过的那样,您将会非常困惑。 MATLAB x(1:5:end)转换为Python x [0 :: 5]。返回MATLAB用户的NumPy,然后向下浏览至“线性代数等效项”部分(大约在页面的一半)。它给出了如何往返的字典。

#3 楼

这也许行得通,也可能行不通,但是您可能想尝试Matlab到Python的转换器,例如mat2py。我从没有尝试过,但是可能会节省一些时间。另外,还有关于Matlab到Numpy转换的页面,可以帮助您熟悉两者之间的区别。

评论


相关:stackoverflow.com/questions/9845292/…

–艾奥尼斯·菲利皮德(Ioannis Filippidis)
13年8月26日在4:35