Преобразование MATLAB в Python (NumPy, SciPy, MatplotLib?)

Я пытаюсь преобразовать следующий код в Python из MATLAB для проекта 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') 

Все предложения с благодарностью получили!

Дэйв!

3 Solutions collect form web for “Преобразование MATLAB в Python (NumPy, SciPy, MatplotLib?)”

Хм … много вещей.

У Python нет end ключевого слова, поэтому вам явно нужно больше узнать о синтаксисе Python.

Массивы и фрагменты Python индексируются с помощью [] not () . Диапазоны выражаются, например, как диапазон (0,10), но срезы в смысле Matlab существуют только в пакетах расширения, таких как numpy, и каждый из них имеет свой собственный интерфейс.

Да, вы хотите использовать matplotlib для построения графика, он имеет почти такие же возможности, как интерфейс построения Matlab, по крайней мере на этом уровне.

Похоже, вы предполагаете, что Python будет иметь те же имена методов, что и Matlab в некотором случайном пакете. Это не очень хороший план. Вместо этого найдите метод Matlab в своей документации, который находится в сети, узнайте, что именно он делает, а затем прочитайте в документации пакета Python метод, который делает то, что вы хотите. Это может не существовать, но я уверен, что в программе это просто, большинство из них вам понадобятся.

Самое важное, что вам нужно понять при преобразовании любого кода Matlab на другие языки, – это то, как работают массивы Matlab, что крайне необычно (но отлично подходит для целевых приложений). У Numpy есть те же возможности, но для них совершенно разные обозначения.

Последовательный модуль уже предоставил вам открытый файл на порт, поэтому вам не нужен fopen.

Я думаю, вам нужно потратить много времени на документацию как для Python, так и для Matlab, потому что совершенно ясно, что вы не понимаете ни того, ни другого.

Не позволяйте мне отговаривать вас, я просто честен о том, где вы находитесь.

Одна маленькая точка – индексирование между ними различно. Если вы просто скопируете все с MATLAB на Python, как вы, кажется, сделали, вы будете очень смущены. MATLAB x (1: 5: end) переводит на Python x [0 :: 5]. Вернитесь к NumPy для пользователей MATLAB и просмотрите раздел «Линейные эквиваленты алгебры» (примерно на половину страницы). Он дает словарь о том, как идти туда и обратно.

Это может работать или не работать, но вы можете попробовать преобразовать Matlab в Python, например mat2py . Я никогда не пробовал их, но это может сэкономить некоторое время. Кроме того, есть страница о преобразовании Matlab в Numpy, которая поможет вам познакомиться с различиями между ними.

  • Случайное число из гистограммы
  • Каково подходящее место для быстрой работы на Mac 10.8 с домашним Python?
  • Границы диаграммы Voronoi: как получить ребра в форме (point1, point2) из ​​объекта scipy.spatial.Voronoi?
  • Как по-разному умножить матрицу scipy.sparse на широковещательный плотный массив 1d?
  • получить значение R ^ 2 из scipy.linalg.lstsq
  • Как узнать собственные векторы, соответствующие конкретному собственному значению матрицы?
  • scipy.integrate.quad точность по большим числам
  • Pip / easy_install игнорирует ARCHFLAGS в установке SciPy?
  • Python - лучший язык программирования в мире.