4

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')

すべての提案に感謝します!

デイブ!

4

3 に答える 3

11

ええと...たくさんあります。

Pythonにはendキーワードがないので、Pythonの構文についてもっと読む必要があることは明らかです。

Pythonの配列とスライスは、[]notでインデックス付けされます()。たとえば、範囲はrange(0,10)として表されますが、Matlabの意味でのスライスは、numpyなどの拡張パッケージにのみ存在し、それぞれに独自のインターフェイスがあります。

はい、プロットにmatplotlibを使用したいのですが、少なくともこのレベルでは、Matlabのプロットインターフェイスとほぼ同じ機能を備えています。

Pythonは、ランダムなパッケージでMatlabと同じメソッド名を持っていると推測しているようです。これは良い計画ではありません。代わりに、オンラインのドキュメントでMatlabメソッドを検索し、それが何をするのかを正確に調べてから、Pythonパッケージのドキュメントを読んで、必要なことを実行するメソッドを探してください。これは存在しないかもしれませんが、私はプログラムでこれほど単純な、あなたが必要とするもののほとんどがそうするだろうと確信しています。

Matlabコードを他の言語に変換する際に理解する必要がある最も重要なことは、Matlab配列の動作方法です。これは非常に珍しいことです(ただし、ターゲットアプリケーションには優れています)。Numpyの機能はほぼ同じですが、表記がまったく異なります。

シリアルモジュールはすでにポート上で開いているファイルオブジェクトを提供しているので、fopenは必要ありません。

現時点ではどちらも理解していないことは明らかなので、PythonとMatlabの両方のドキュメントに多くの時間を費やす必要があると思います。

私があなたを落胆させないでください、私はあなたがどこにいるのかについて正直に言っています。

于 2010-02-24T14:58:01.920 に答える
5

1 つの小さな点 - 2 つの間のインデックス付けは異なります。あなたが行ったように、MATLAB から Python にすべてをコピーすると、非常に混乱するでしょう。MATLAB x(1:5:end) は Python x[0::5] に変換されます。NumPy for MATLAB Users に戻り、"Linear Algebra Equivalents" というセクション (ページの約半分) までスキャンします。行き来する方法の辞書を提供します。

于 2010-02-24T19:53:33.610 に答える
2

これは機能する場合と機能しない場合がありますが、mat2pyなどの Matlab から Python へのコンバーターを試してみることをお勧めします。私はそれらを試したことはありませんが、時間を節約できるかもしれません。また、Matlab から Numpy への変換に関するこのページがあり、この2 つの違いを理解するのに役立ちます。

于 2010-02-24T19:19:34.100 に答える