Scipy Welch и MATLAB pwelch не дают одинакового ответа - PullRequest
0 голосов
/ 10 мая 2018

У меня проблемы с python из-за метода scipy.signal, называемого welch (https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.signal.welch.html),), который оценивает частотный спектр сигнала времени, потому что он (вообще) не обеспечивает тот же вывод, что и метод MATLABназывается pwelch, учитывая те же параметры (размер окна, перекрытие и т. д.). Ниже приведен мой код на каждом языке, а входные и выходные файлы находятся по ссылке здесь:

https://www.dropbox.com/s/2ch36phbbmjfhqg/inputs_outputs.zip?dl=0

Вход представляет собой двумерный массив со строками, являющимися временными шагами, а каждый столбец является сегментом сигнала. Столбцы на выходе представляют собой спектр от соответствующих столбцов на входе.

Python:

import numpy as np
from scipy.signal import welch, get_window
input = np.genfromtxt('python_input.csv', delimiter=',')
fs = 128

window = get_window('hamming', fs*1)
ff,yy = welch(input, fs=fs, window = window, noverlap = fs/2, nfft=fs*2, 
axis=0, scaling="density", detrend=False)
np.savetxt("python_spectrum.csv", 10*np.log10(yy), delimiter=",")

MATLAB:

input       = csvread('matlab_input.csv');
fs          = 128
win         = hamming(fs);
[pxx,f]     = pwelch(input ,win,[],[],fs,'psd');
csvwrite('matlab_spectrum.csv',pxx);

Я подозреваю, что проблема в scipy, поскольку его вывод не имеет смысла с точки зрения отражения фильтров, которые я использовал (полоса пропускания Баттерворта 4-го порядка от 0,3 до35 Гц с фильтрованием) заранее - вывод MATLAB, однако, делает:

Каждый метод выводится с использованием imagesc в MATLAB

И некоторых графиках элементамудрые различия здесь

Поэлементные различия (ось Y должна быть 0-64!) (третий график, я исключил самые крайние значения)

Я попробовалс простой синусоидой, и она хорошо работала на обоих языках программирования - так что я полностью потерялся.

1 Ответ

0 голосов
/ 10 мая 2018

Ваши файлы Python и MATLAB не упорядочены одинаково, что приводит к ошибке. Несмотря на то, что формы массивов одинаковы, значения упорядочены по строкам в Python и по столбцам в MATLAB.

Вы можете исправить это путем изменения формы входного массива и транспонирования. Это даст вам тот же порядок значений, что и в MATLAB:

input = input.reshape((input.shape[1], input.shape[0])).T
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...