我正试图将下面的代码从一个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');
这是我可怜的表弟版本
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')
所有的建议都收到了!
戴夫!
两者之间的一个小点索引是不同的。如果你把所有的东西从MATLAB复制到Python,就像你看起来做的那样,你会非常困惑。MATLAB x(1:5:end)转换为pythonx[0:5]。回到NumPy for MATLAB Users并向下扫描到名为“线性代数等价物”的部分(大约是页面的一半)。它提供了一本如何来回走动的词典。
嗯。。。很多事情。
Python没有
end
关键字,因此您显然需要更多地了解Python的语法。Python数组和切片的索引是
[]
,而不是()
。例如,Ranges被表示为range(0,10),但是从Matlab的角度来看,slices只存在于numpy这样的扩展包中,并且每个扩展包都有自己的接口。是的,您想使用matplotlib进行绘图,它的功能与Matlab的绘图界面几乎相同,至少在这个级别上是这样。
看起来您在猜测Python在某个随机包中将具有与Matlab相同的方法名。这不是个好计划。相反,在它的联机文档中查找Matlab方法,确切地了解它所做的事情,然后在Python包文档中阅读一个实现您所希望的方法。这可能不存在,但我敢打赌,在这个简单的程序中,你需要的大多数都会存在。
在将任何Matlab代码转换为其他语言时,您需要了解的最重要的事情是Matlab数组的工作方式,这是非常不寻常的(但对于其目标应用程序来说非常好)。Numpy有相同的功能,但是它们的符号完全不同。
串行模块已经在端口上给了您一个打开的文件对象,所以您不需要fopen。
我认为您需要花费大量时间来阅读Python和Matlab的文档,因为很明显您目前都不理解这两个文档。
别让我让你气馁,我只是老实告诉你你在哪。
这可能起作用,也可能不起作用,但您可能希望尝试使用Matlab到Python的转换器,例如mat2py。我从来没有试过,但可能会省点时间。另外,还有this page关于Matlab到Numpy的转换,可以帮助您了解两者之间的区别。
相关问题 更多 >
编程相关推荐