振幅和相位谱。改变相位,保持振幅不变
Amplitude and phase spectrum. Shifting the phase leaving amplitude untouched
我有在相关点具有等效间隔和相应测量值的数据。例如,这里是我所拥有的数据的摘录:
y =[2.118, 2.1289,
2.1374,
2.1458,
2.1542,
2.1615,
2.1627,
2.165
2.1687...]
点之间的间隔是0.1
所以,我需要从数据中得到的是振幅谱(振幅与频率)和相位谱(相位角与频率)。
此外,我应该将数据的相位移动负 90 度 (-pi/2)。
在移动相位并保持幅度不变后,我需要执行反向 fft 并获得新信号。我想在 Python.
中执行此操作
你能给我一个执行这个的例子吗?
我使用的代码是从另一个SO问题中提取的,但我做了一些修改
## Perform FFT WITH SCIPY
signalFFT = np.fft.fft(y)
## Get Power Spectral Density
signalPSD = np.abs(signalFFT) ** 2
signalPhase = np.angle(signalFFT)
## Shift the phase py +90 degrees
new_signalPhase =(180/np.pi)*np.angle(signalFFT)+90
## Get frequencies corresponding to signal
fftFreq = np.fft.fftfreq(len(signalPSD), 0.1)
## Get positive half of frequencies
i = fftFreq>0
##
plt.figurefigsize=(8,4)
#plt.plot(fftFreq[i], 10*np.log10(signalPSD[i]));
plt.plot(fftFreq[i], new_signalPhase[i]);
plt.ylim(-200, 200);
plt.xlabel('Frequency Hz');
plt.ylabel('Phase Angle')
plt.grid()
plt.show()
问题是我想重新生成具有相同振幅但相位偏移的信号。我知道答案与ifft有关,但是我应该如何为它准备数据呢?你能告诉我进一步的步骤吗?
output
这是经过一些修改的代码。我们应用傅里叶变换,对变换后的信号进行相移,然后执行傅里叶逆变换以产生相移后的时域信号。
请注意,变换是通过 rfft() 和 irfft() 完成的,相移是通过简单地乘法完成的通过 cmath.rect(1.,phase) 转换后的数据。相移相当于将复数变换信号乘以 exp( i * phase ).
在图形中,在左侧面板中,我们显示了原始信号和移位信号。新信号提前 90 度。在右面板中,我们在左轴上显示了功率谱。在这个例子中,我们有一个单一频率的电源。相位绘制在右轴上。但同样,由于我们只有一个频率的功率,所以相位谱在其他任何地方都显示出噪声。
#!/usr/bin/python
import matplotlib.pyplot as plt
import numpy as np
import cmath
# Generate a model signal
t0 = 1250.0
dt = 0.152
freq = (1./dt)/128
t = np.linspace( t0, t0+1024*dt, 1024, endpoint=False )
signal = np.sin( t*(2*np.pi)*freq )
## Fourier transform of real valued signal
signalFFT = np.fft.rfft(signal)
## Get Power Spectral Density
signalPSD = np.abs(signalFFT) ** 2
signalPSD /= len(signalFFT)**2
## Get Phase
signalPhase = np.angle(signalFFT)
## Phase Shift the signal +90 degrees
newSignalFFT = signalFFT * cmath.rect( 1., np.pi/2 )
## Reverse Fourier transform
newSignal = np.fft.irfft(newSignalFFT)
## Uncomment this line to restore the original baseline
# newSignal += signalFFT[0].real/len(signal)
# And now, the graphics -------------------
## Get frequencies corresponding to signal
fftFreq = np.fft.rfftfreq(len(signal), dt)
plt.figure( figsize=(10, 4) )
ax1 = plt.subplot( 1, 2, 1 )
ax1.plot( t, signal, label='signal')
ax1.plot( t, newSignal, label='new signal')
ax1.set_ylabel( 'Signal' )
ax1.set_xlabel( 'time' )
ax1.legend()
ax2 = plt.subplot( 1, 2, 2 )
ax2.plot( fftFreq, signalPSD )
ax2.set_ylabel( 'Power' )
ax2.set_xlabel( 'frequency' )
ax2b = ax2.twinx()
ax2b.plot( fftFreq, signalPhase, alpha=0.25, color='r' )
ax2b.set_ylabel( 'Phase', color='r' )
plt.tight_layout()
plt.show()
这是图形输出。
我有在相关点具有等效间隔和相应测量值的数据。例如,这里是我所拥有的数据的摘录:
y =[2.118, 2.1289, 2.1374, 2.1458, 2.1542, 2.1615, 2.1627, 2.165 2.1687...]
点之间的间隔是0.1
所以,我需要从数据中得到的是振幅谱(振幅与频率)和相位谱(相位角与频率)。 此外,我应该将数据的相位移动负 90 度 (-pi/2)。
在移动相位并保持幅度不变后,我需要执行反向 fft 并获得新信号。我想在 Python.
中执行此操作你能给我一个执行这个的例子吗?
我使用的代码是从另一个SO问题中提取的,但我做了一些修改
## Perform FFT WITH SCIPY
signalFFT = np.fft.fft(y)
## Get Power Spectral Density
signalPSD = np.abs(signalFFT) ** 2
signalPhase = np.angle(signalFFT)
## Shift the phase py +90 degrees
new_signalPhase =(180/np.pi)*np.angle(signalFFT)+90
## Get frequencies corresponding to signal
fftFreq = np.fft.fftfreq(len(signalPSD), 0.1)
## Get positive half of frequencies
i = fftFreq>0
##
plt.figurefigsize=(8,4)
#plt.plot(fftFreq[i], 10*np.log10(signalPSD[i]));
plt.plot(fftFreq[i], new_signalPhase[i]);
plt.ylim(-200, 200);
plt.xlabel('Frequency Hz');
plt.ylabel('Phase Angle')
plt.grid()
plt.show()
问题是我想重新生成具有相同振幅但相位偏移的信号。我知道答案与ifft有关,但是我应该如何为它准备数据呢?你能告诉我进一步的步骤吗?
output
这是经过一些修改的代码。我们应用傅里叶变换,对变换后的信号进行相移,然后执行傅里叶逆变换以产生相移后的时域信号。
请注意,变换是通过 rfft() 和 irfft() 完成的,相移是通过简单地乘法完成的通过 cmath.rect(1.,phase) 转换后的数据。相移相当于将复数变换信号乘以 exp( i * phase ).
在图形中,在左侧面板中,我们显示了原始信号和移位信号。新信号提前 90 度。在右面板中,我们在左轴上显示了功率谱。在这个例子中,我们有一个单一频率的电源。相位绘制在右轴上。但同样,由于我们只有一个频率的功率,所以相位谱在其他任何地方都显示出噪声。
#!/usr/bin/python
import matplotlib.pyplot as plt
import numpy as np
import cmath
# Generate a model signal
t0 = 1250.0
dt = 0.152
freq = (1./dt)/128
t = np.linspace( t0, t0+1024*dt, 1024, endpoint=False )
signal = np.sin( t*(2*np.pi)*freq )
## Fourier transform of real valued signal
signalFFT = np.fft.rfft(signal)
## Get Power Spectral Density
signalPSD = np.abs(signalFFT) ** 2
signalPSD /= len(signalFFT)**2
## Get Phase
signalPhase = np.angle(signalFFT)
## Phase Shift the signal +90 degrees
newSignalFFT = signalFFT * cmath.rect( 1., np.pi/2 )
## Reverse Fourier transform
newSignal = np.fft.irfft(newSignalFFT)
## Uncomment this line to restore the original baseline
# newSignal += signalFFT[0].real/len(signal)
# And now, the graphics -------------------
## Get frequencies corresponding to signal
fftFreq = np.fft.rfftfreq(len(signal), dt)
plt.figure( figsize=(10, 4) )
ax1 = plt.subplot( 1, 2, 1 )
ax1.plot( t, signal, label='signal')
ax1.plot( t, newSignal, label='new signal')
ax1.set_ylabel( 'Signal' )
ax1.set_xlabel( 'time' )
ax1.legend()
ax2 = plt.subplot( 1, 2, 2 )
ax2.plot( fftFreq, signalPSD )
ax2.set_ylabel( 'Power' )
ax2.set_xlabel( 'frequency' )
ax2b = ax2.twinx()
ax2b.plot( fftFreq, signalPhase, alpha=0.25, color='r' )
ax2b.set_ylabel( 'Phase', color='r' )
plt.tight_layout()
plt.show()
这是图形输出。