Перевел расчет SNR из MATLAB в синтаксис python

это код MATLAB, который я хотел бы перевести на Python.

function [SNR] = bvpsnr(BVP, FS, HR, PlotTF)
HR_F=HR/60;
NyquistF = FS/2;
FResBPM = 0.5; %resolution (bpm) of bins in power spectrum used to determine PR and SNR
N = (60*2*NyquistF)/FResBPM; %number of bins in power spectrum

%% Construct Periodogram
[Pxx,F] = periodogram(BVP,hamming(length(BVP)),N,FS);
GTMask1 = (F >= HR_F-0.1)&(F <= HR_F+0.1);
GTMask2 = (F >= HR_F*2-0.2)&(F <= HR_F*2+0.2);
SPower = sum(Pxx(GTMask1|GTMask2));
FMask2 = (F >= 0.5)&(F <= 4);
AllPower = sum(Pxx(FMask2));
SNR = pow2db(SPower/(AllPower-SPower));

вот попробовал перевести на питоне

def pow2db(x):
    return 10 * log10(x)

def SNR(bvp, fps, hr):

    HR_F = hr/60
    Nyquist = fps/2
    FResBPM = 0.5
    N = (60*2*Nyquist)/FResBPM
    print(N)

    f_set, Pxx_den = welch(bvp, fps, window='hann', nperseg=32)
    GTMask1 = f_set >= HR_F-0.1 and f_set <= HR_F+0.1
    GTMask2 = f_set >= HR_F*2-0.2 and f_set <= HR_F*2+0.2
    SPower = sum(Pxx_den[GTMask1:GTMask2])
    FMask2 = f_set >= 0.5 and f_set <=3
    AllPower = sum(Pxx_den[FMask2])
    SNR = pow2db(SPower/(AllPower-SPower))

когда я запускаю следующий код с моими данными, я получаю сообщение об ошибке:

GTMask1 = f_set >= HR_F-0.1 and f_set <= HR_F+0.1 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы сравнить массивы numpy по элементам, используйте оператор & (логический и):

GTMask1 = (f_set >= HR_F-0.1) & (f_set <= HR_F+0.1)
GTMask2 = (f_set >= HR_F*2-0.2) & (f_set <= HR_F*2+0.2)

Для логический или используйте |:

SPower = sum(Pxx_den[GTMask1|GTMask2])

Другие вопросы по теме