为什么在 `fft` 和 `ifft` 之后信号添加噪声导致信号不可发现?

信息处理 fft 信号分析 傅里叶变换 IFFT 时频
2022-02-09 03:39:32

众所周知,sinc(t)的傅里叶变换是rect(f)。
简单的 python 脚本,用于在随机正常噪声之后发现fft信号ifft

import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1234)

peak=np.fft.fft(np.sinc(np.linspace(-4, 4, 200)))
peak_ifft=np.fft.ifft(peak)
n=200
noise=np.random.normal(loc=0, scale=np.sqrt(2)/2, size=(n, 2)).view(np.complex128)
signal=noise+np.reshape(np.asarray(peak),(-1,1))
plt.figure()
plt.subplot(2,2,1)
plt.plot(np.abs(signal))
plt.title('power vs freq')
plt.subplot(2,2,2)
signal_ifft=np.fft.ifft(signal)
plt.plot(signal_ifft)
plt.title('should appear sinc,but not')
plt.subplot(2,2,3)
plt.plot(peak_ifft)
plt.title('should be sinc,and yes')
plt.show()

输出如下:
在此处输入图像描述

既然x(t)+y(t)<->X(f)+Y(f)np.fft.ifft(np.fft(signal)) 回到原点signal,为什么不能np.fft.ifft(np.fft(signal+noise))呢?

1个回答

你只想做信号+噪音,噪音部分就可以了。

对于情节,您需要 fft 的绝对值,您只是在绘制实部。

import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1234)
# make data
x = np.linspace(-4, 4, 200)
y = np.sinc(x)
# make fft and ifft
peak = np.fft.fft(y)
peak_ifft = np.fft.ifft(peak)
# make the frequency domain
freq = np.fft.fftfreq(len(x), np.diff(x).mean())
# make some noise!!!
n = 200
noise = np.random.normal(loc=0, scale=0.1, size=n)
# signal with noise, and the fft and ifft
signal = y + noise
peak2 = np.fft.fft(signal)
peak_ifft2 = np.fft.ifft(peak2)
# plotting
plt.figure()
plt.plot(x, y)
plt.plot(x, peak_ifft, ':')
plt.figure()
plt.plot(freq, np.abs(peak))
plt.xlim([-5,5])
plt.figure()
plt.plot(x, signal)
plt.plot(x, peak_ifft2, ':')
plt.figure()
plt.plot(freq, np.abs(peak2))
plt.xlim([-5.,5])

在此处输入图像描述