做了一个脚本验证一下:
[Python] 纯文本查看 复制代码 from scipy.fftpack import fft, ifft
import matplotlib.pyplot as plt
from math import sin, pi
import numpy as np
def main():
fs1 = 10000 # Hz
fs2 = 9000 # Hz
f_ac = 100000 # Hz
dc = 1.65 # v
N = 90 # number of sample points
ac1 = [0.5 * sin(2 * pi * f_ac * i / fs1 + pi / 4) for i in range(N)] # 0.5v sinewave, sampling in 10KHz
ac2 = [0.5 * sin(2 * pi * f_ac * i / fs2 + pi / 4) for i in range(N)] # 0.5v sinewave, sampling in 9KHz
signal1 = [(dc + x) for x in ac1]
signal2 = [(dc + x) for x in ac2]
fft_sig1 = fft(signal1)
fft_sig2 = fft(signal2)
# fft results - magnitude
fft_sig1_mag = np.abs(fft_sig1)
fft_sig2_mag = np.abs(fft_sig2)
# remove 1khz component from spectrum
fft_sig2[10] = 0.0 + 0.0j
fft_sig2[80] = 0.0 + 0.0j
fft_sig2_mag2 = np.abs(fft_sig2)
# ifft to recover original signal
signal1_ifft = np.real(ifft(fft_sig1))
signal2_ifft = np.real(ifft(fft_sig2))
fig, ax = plt.subplots(2, 2)
ax[0][0].set_title("signal simulate")
ax[0][0].plot(signal1, label="sig1: dc+10khz")
ax[0][0].plot(signal2, label="sig2: dc+9khz")
ax[0][0].set_xlim(0, N)
ax[0][0].set_ylim(0, 3.3)
ax[0][0].legend()
ax[0][1].set_title("signal fft results")
ax[0][1].plot(fft_sig1_mag, label="sig1")
ax[0][1].plot(fft_sig2_mag, label="sig2")
ax[0][1].legend()
ax[1][0].set_title("sig2 remove 1khz")
ax[1][0].plot(fft_sig1_mag, label="sig1")
ax[1][0].plot(fft_sig2_mag2, label="sig2: remove 1khz")
ax[1][0].legend()
ax[1][1].set_title("after ifft")
ax[1][1].plot(signal1_ifft, label="sig1")
ax[1][1].plot(signal2_ifft, label="sig2")
ax[1][1].legend()
plt.show()
if __name__ == "__main__":
main() |