Python: получение правильного фазового спектра без шума - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь показать 30-фазный сдвиг при 50 Гц.

Ниже приведен код, который я использовал:

import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft,ifft,fftshift

pi = np.pi
A =0.5
f = 50
phase = 50
fs = 32*f
t  = np.arange(0, 0.5-1/fs, 1/fs)#start, stop, steps

phi = phase*pi/180 #convert phase in degree into radians
x = A*np.sin(2*pi*f*t+phi)

fig1, ax = plt.subplots(nrows=1, ncols=1) #create figure handle
ax.plot(t,x)
ax.set_title('Voltage Reference Signal')
ax.set_xlabel('Time [s]')
ax.set_ylabel('Voltage [V]')
fig1.show()

N= 512
X = 1/N*fftshift(fft(x,N))

f_bin = fs/N
sampleIndex = np.arange(-N/2,N/2)#start,stop
f =sampleIndex*f_bin

fig2,ax = plt.subplots(nrows =1, ncols=1)
ax.plot(f, abs(X))
ax.set_xlabel('Frequency [Hz]')
ax.set_xlim(-100,100)
ax.set_ylabel('|X(k)|')
fig2.show()

print (X[0:5])# testing purposes
A = X[0:5].real#print(A)
B = X[0:5].imag#print(B)
phase_test = np.arctan2(B,A)*180/pi
phase = np.arctan2(X.imag,X.real)*180/pi


fig3,ax = plt.subplots (nrows =1,ncols =1)
ax.plot(f, phase)
ax.set_title('FFT Phase Shift for Vref with Noise')
ax.set_xlabel('Frequency [Hz]')
ax.set_xlim(-200,200)
ax.set_ylabel('Phase Shift')
fig3.show()

X2 = X 
threshold =max(abs(X))/100000
y = abs(X2)
if y<threshold :
X2  =0 
phase =np.arctan2(X2.imag,X2.real)*180/pi 
fig4, ax = plt.subplots(nrows=1,ncols =1)
ax.plot(f,np.angle(X2))
ax.set_title('FFT Phase Shift for Vref without Noise')
ax.set_xlabel('Frequency[Hz]')
ax.set_xlim(-200,200)
ax.set_ylabel('Phase Shift')
fig4.show()

, который я написал со ссылкой на код MATLAB что делает то же самое (ссылка на сайт: Газовые волны фазы амплитуды ) Технический перевод с MATLAB на Python

Это часть кода MATLAB, как правильно преобразовать в Python .

threshold = max(abs(X))/10000
X2(abs(X) <threshold) =0

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

...