按频率 returns 移动图手动过滤 FFT

Manually filtering a FFT by frequency returns a shifted plot

我正在学习数值和计算class,所以我们被要求做一些其他包可以更有效地完成的事情,但我们必须按照要求去做。在这个问题中,我得到了一些代码,这些代码会产生嘈杂的高斯分布,并要求我过滤高于或低于特定频率的频率。因此,我得到了 fft 频率并使用列表理解将所有频率设置为大于绝对值 2。然后,我使用 for 循环在频率为零时将系数设置为零。然后执行反向 fft 以获得过滤后的高斯。我得到了正确的图表,但它向下移动了 0.03,看起来 for 循环正在这样做。我不确定为什么。这是我得到的代码和数字。

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


##############Start Original Code###############
def gaussNoisy(x, noiseAmp):
    noise=noiseAmp*(np.random.randn(len(x)))
    return np.exp(-0.5*x*x)*(1.0+noise)
N=256
x=np.linspace(-4.0, 4.0, N)
y=gaussNoisy(x, 0.1)
##################End Original Code############

dx = x[1] - x[0]#define step size
Y_x = fft.fft(y) #perform fft
Y_x_shift = fft.fftshift(Y_x)
FFT_freq = fft.fftfreq(y.size,d=dx) #frequency spectrum
FFT_freq_shift = fft.fftshift(FFT_freq)

fig = plt.figure(1, figsize=(16,12))
ax1 = fig.add_subplot(211)
ax1.plot(x,y)
ax1.set_xlabel('Position')
ax1.set_ylabel('Amplitude')







#FFT_filtered32 = np.copy(FFT_freq) #Initialize FFT filter arrays
#FFT_filtered8 = np.copy(FFT_freq)
FFT_filtered2 = np.copy(FFT_freq)

Y_x2 = np.copy(Y_x)
Y_x32 = np.copy(Y_x)



FFT_filtered32 = [item if -32 <= item <= 32 else 0 for item in FFT_filtered32] #Filters arrays between +/- 32, 8, 2
FFT_filtered8 = [item if -8 <= item <= 8 else 0 for item in FFT_filtered8]
FFT_filtered2 = [item if -2 <= item <= 2 else 0 for item in FFT_filtered2]




l = 0
for l in range(Y_x.size):
    if  FFT_filtered2[l] == 0:
        Y_x2[l] = 0
    l += 1
    

fig = plt.figure(1, figsize=(16,12))
ax1 = fig.add_subplot(211)
ax1.plot(x,y)
ax1.set_xlabel('Position')
ax1.set_ylabel('Amplitude')
ax1.plot(x, fft.ifft(Y_x2))

这个问题的原因是 l 循环中的直流分量被归零了。这会导致信号出现明显的 0.3 偏移,因为原始信号不是零均值。要解决此问题,例如通过从 1 开始循环来跳过 l=0:l in range(1, Y_x.size).