Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-执行FFT忽略来自MEMS麦克风的直流偏移_Python_Matplotlib_Scipy_Fft_Frequency - Fatal编程技术网

Python-执行FFT忽略来自MEMS麦克风的直流偏移

Python-执行FFT忽略来自MEMS麦克风的直流偏移,python,matplotlib,scipy,fft,frequency,Python,Matplotlib,Scipy,Fft,Frequency,我试图对一个wav文件进行FFT,结果很好,但在我的图中,我看到了0赫兹的巨大振幅。我假设它是直流偏移。我的目的是在绘图中或直接在代码中忽略此DC偏移,因为它阻止我看到实际噪声。在我的例子中,我记录了一个大约6.1kHz的噪音,如果我在那个点放大,我可以清楚地看到它,但在一般情况下,它是不可见的,因为0Hz的振幅。如果你告诉我如何可以忽略0Hz(或直流偏置),我会很高兴 #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__

我试图对一个wav文件进行FFT,结果很好,但在我的图中,我看到了0赫兹的巨大振幅。我假设它是直流偏移。我的目的是在绘图中或直接在代码中忽略此DC偏移,因为它阻止我看到实际噪声。在我的例子中,我记录了一个大约6.1kHz的噪音,如果我在那个点放大,我可以清楚地看到它,但在一般情况下,它是不可见的,因为0Hz的振幅。如果你告诉我如何可以忽略0Hz(或直流偏置),我会很高兴

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function
import scipy.io.wavfile as wavfile
import scipy
import scipy.fftpack
import numpy as np
from matplotlib import pyplot as plt

fs_rate, signal = wavfile.read("file.wav")
print ("Frequency sampling", fs_rate)
l_audio = len(signal.shape)
print ("Channels", l_audio)
if l_audio == 2:
    signal = signal.sum(axis=1) / 2
N = signal.shape[0]
print ("Complete Samplings N", N)
secs = N / float(fs_rate)
print ("secs", secs)
Ts = 1.0/fs_rate # sampling interval in time
print ("Timestep between samples Ts", Ts)
t = scipy.arange(0, secs, Ts) # time vector as scipy arange field / numpy.ndarray
FFT = abs(scipy.fft(signal))
FFT_side = FFT[range(N/4)] # one side FFT range
freqs = scipy.fftpack.fftfreq(signal.size, t[1]-t[0])
fft_freqs = np.array(freqs)
freqs_side = freqs[range(N/4)] # one side frequency range
fft_freqs_side = np.array(freqs_side)

print (abs(FFT_side))

plt.subplot(211)
p1 = plt.plot(t, signal, "g") # plotting the signal
plt.xlabel('Time')
plt.ylabel('Amplitude')

plt.subplot(212)
p2 = plt.plot(freqs_side, abs(FFT_side), "b") # plotting the positive fft spectrum
plt.xlabel('Frequency (Hz)')
plt.ylabel('Count single-sided')
plt.show()

较大的偏移通常表示信号预处理不当。常用的方法包括贬低数据和使用线性回归对数据进行去分化。这里有一个例子

from matplotlib.pyplot import *

from numpy import *

dt = 1/1000
T  = 1
t  = arange(0, T, dt)

n = t.size
y = sin(pi * t * 3)   + 39  + 3 * t + random.rand(n)

from scipy import optimize
# subtract drift
lin = lambda x, a, b : a * x + b 
coeff, _ = optimize.curve_fit(lin,t, y)
dmy= y- coeff[0] * t + coeff[0]

# compute power
fy = abs(fft.fft(y))[:n//2] ** 2
fyn= abs(fft.fft(dmy - dmy.mean()))[:n//2] ** 2 # NB demeaned

freq= linspace(0, T / dt, n//2) # get freqs
fig, ax = subplots(2, sharex = 'all')
for axi, data, label in zip(ax, [fy,fyn], 'raw processed'.split()):
    axi.plot(freq, data)
    axi.set(xlim = (0, 10), title = label)
axi.set_xlabel('freq')
subplots_adjust(hspace = .5)

在FFT之前应用a将去除直流分量上的大部分“裙板”。