如何用fft在频域中对正弦波进行相移处理?

2024-03-29 10:09:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在频域中改变正弦波

我的想法是:

  1. 傅里叶变换
  2. 在频域中加入pi相移
  3. 傅里叶逆变换

代码:

t=np.arange(0, 6 , 0.001)
values = A*np.sin(t)
ft_values= np.fft.fft(values)
ft_values_phase=ft_values+1j*np.pi
back_again= np.fft.ifft(ft_values_phase)
plt.subplot(211)
plt.plot(t,values)
plt.subplot(212)
plt.plot(t,back_again)

我期望有两张图像,其中一个波被π移位,但是我得到了这个结果

(无相移):

enter image description here

谢谢你的帮助!在


Tags: 代码fftplotnpbackpipltvalues
2条回答

你没有做相移。在

你所做的就是添加一个6000向量,比如说p,常数值p(i)=jπ,即V的FFT。在

让我们写下Ṽ=V+p。在

由于FFT(和IFFT)的线性关系,你所说的back_again

其中,当然,p=IFFT(p)是差异values-back_again-现在,让我们检查一下什么是p。。。在

In [51]: P = np.pi*1j*np.ones(6000) 
    ...: p = np.fft.ifft(P) 
    ...: plt.plot(p.real*10**16, label='real(p)*10**16') 
    ...: plt.plot(p.imag, label='imag(p)') 
    ...: plt.legend();

antitransform of P

如您所见,您修改了values,方法是在IFFT的计算中添加一个实分量。在

常数的变换在ω=0处为尖峰,常数的反变换(频域)为t=0处的尖峰。在

正如我在一篇删除的评论中所说,如果你不把一个常数加到每个FFT项上,而是把它们乘以一个常数,你也会把信号乘以同一个常数(记住,FFT和IFFT是线性的)。在

要做你想做的,你必须记住,时域中的位移只是(周期性)信号与时移尖峰的(循环)卷积,所以你必须将信号的FFT乘以移位尖峰的FFT。在

因为Dirac分布的Fourier变换δ(t-a)exp(-iωa),所以必须将信号FFT的每个项乘以一个频率相关项。在


一个例子

一些准备工作

^{pr2}$

计算以n为中心的狄拉克分布在N上的离散FT的函数

In [64]: def shift(n, N): 
    ...:     s = np.zeros(N) 
    ...:     s[n] = 1.0 
    ...:     return np.fft.fft(s)                                                                                     

让我们画一个信号和移位信号

In [65]: t = np.arange(4096)*np.pi/1024                                                                               
In [66]: v0 = np.sin(t)                                                                                               
In [67]: v1 = np.sin(t-np.pi/4)                                                                                       
In [68]: f, a = plot(t, v0)                                                                                           
In [69]: a.plot(t, v1, label='shifted by $\\pi/4$');                                                                   
In [70]: a.legend();

enter image description here

现在计算正确尖峰的FFT(注意π/4=(4π)/16),移位信号的FFT,s.s的FFT,最后绘制我们的结果

In [71]: S = shift(4096//16-1, 4096)                                                                                  
In [72]: VS = np.fft.fft(v0)*S                                                                                        
In [73]: vs = np.fft.ifft(VS)                                                                                         
In [74]: f, ay = plot(t, v0)                                                                                          
In [75]: ay.plot(t, vs.real, label='shifted in frequency domain');                                                    
In [76]: ay.legend();

enter image description here

很好,帮了大忙! 对于任何想做同样事情的人,下面是一个python文件:


import numpy as np
from matplotlib.pyplot import plot, legend
def shift(n, N): 
    s = np.zeros(N) 
    s[n] = 1.0 
    return np.fft.fft(s)  
t = np.linspace(0, 2*np.pi,1000) 
v0 = np.sin(t)                                                                                               
S = shift(1000//4, 1000)  # shift by pi/4
VS = np.fft.fft(v0)*S 
vs = np.fft.ifft(VS)
plot(t, v0 , label='original' )
plot(t,vs.real,label='shifted in frequency domain')
legend()

enter image description here

相关问题 更多 >