Как я могу преобразовать код Matlab в Python? - PullRequest
0 голосов
/ 12 января 2020

Я пытался преобразовать код Matlab в Python, но в этой ситуации xx = diff(xx>setpoint); я не получил тот же результат в python.

fs = 50;
t = [0:1/fs:1];
xx = sin(2*pi*300*t)+2*sin(2*pi*600*t);

xx = xx(:)'/max(abs(xx));   %-- normalize xx
Lx = length(xx);
Lz = round(0.01*fs);
setpoint = 0.02;      
%xx = filter( ones(1,Lz)/Lz, 1, abs(xx) );
xx = diff(xx>setpoint);

На самом деле я не понимаю, что такое утверждение xx = diff(xx>setpoint) до.

1 Ответ

2 голосов
/ 12 января 2020

TL; DR Python отличается, вы можете сделать Python как Matlab, в этом случае я предпочитаю подход Python.


In Python xx>0.002 - это массив логических значений, False и True и np.diff обрабатывают логические значения как таковые, в Matlab xx>0.002 также представляет собой матрицу логических значений, но diff преобразует их в 0 и 1, прежде чем принимать различия, и это подразумевает, что у нас есть больше возможностей в Matlab

In [15]: for a, b in ((0,0), (0,1), (1,0), (1,1)): print(np.diff((a,b)))                  
[0]
[1]
[-1]
[0]

In [16]: f, t = False, True 
    ...: for a, b in ((f,f), (f,t), (t,f), (t,t)): print(np.diff((a,b)))                  
[False]
[ True]
[ True]
[False]

Когда я строю xx и diff(xx>0.02) в Matlab (о, хорошо, в Октаве ... ) У меня есть

enter image description here

Когда я строю xx и np.diff(xx>0.02) в Python + Numpy + Matplotlib, я получаю

enter image description here

Чтобы иметь точно результаты Matlab, мы можем преобразовать логический массив в массив чисел с плавающей точкой, просто умножив на 1.0, все в порядке - так что это график xx и np.diff( 1.0*(xx>0.02) )

enter image description here

Если целью ОП является показать, где сигнал больше 0.02 I смею сказать, что родной Python (без преобразования в float) лучше ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...