我有一个程序,其目的是使用butterworth过滤器过滤噪声信号。代码如下所示。该程序无法编译,因为我在最后一步做了错误" y = butter_bandpass_filter(v_numbers,lowcut,highcut,fs,order = 6)"。 我想得到的是三个图:1。时域中的输入信号,2。频域中的butterworth滤波器。 3.在时域输出滤波后的信号。
from scipy.signal import butter, lfilter
def butter_bandpass(lowcut, highcut, fs, order=5):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
b, a = butter(order, [low, high], btype='band')
return b, a
def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
b, a = butter_bandpass(lowcut, highcut, fs, order=order)
y = lfilter(b, a, data)
return y
if __name__ == "__main__":
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import freqz
# Sample rate and desired cutoff frequencies (in Hz).
fs = 5000.0
lowcut = 0.0
highcut = 2000.0
# Plot the frequency response for a few different orders.
plt.figure(1)
plt.clf()
for order in [3, 6, 9]:
b, a = butter_bandpass(lowcut, highcut, fs, order=order)
w, h = freqz(b, a, worN=2000)
plt.plot((fs * 0.5 / np.pi) * w, abs(h), label="order = %d" % order)
plt.plot([0, 0.5 * fs], [np.sqrt(0.5), np.sqrt(0.5)],
'--', label='sqrt(0.5)')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Gain')
plt.grid(True)
plt.legend(loc='best')
# Filter a noisy signal.
T = 0.9004
nsamples = T * fs
t = np.linspace(0, T, nsamples, endpoint=False)
a = 0.02
f0 =600.0
# Plot the frequency response for a few different orders.
f = open('NIRS_data.txt','r')
number_string = f.readline()
v_numbers = []
while number_string != '':
numbers = number_string.split()
for number in numbers:
v_numbers.append( number )
number_string = f.readline()
plt.figure()
plt.clf()
plt.plot(t,v_numbers, label = 'Noisy signal')
y = butter_bandpass_filter(v_numbers, lowcut, highcut, fs, order=6)
plt.plot(t, y, label='Filtered signal (%g Hz)')
plt.xlabel('time (seconds)')
plt.show()
txt文件的一部分如下所示。数据量为4502.
8.2178200e-02 8.2173600e-02 8.2129400e-02 8.2209000e-02 8.2183000e-02 8.2098900e-02 8.2162500e-02 8.2157700e-02 8.2177900e-02 8.2177600e-02 8.2088400e-02 8.2142900e-02 8.2179600e-02 8.2159200e-02 8.2144800e-02 8.2139000e-02 8.2121200e-02 8.2157900e-02 8.2142600e-02 8.2190600e-02 8.2129500e-02 8.2125800e-02 8.2097500e-02 8.2087300e-02 8.2206800e-02 8.2175400e-02 8.2183300e-02 8.2197400e-02 8.2129500e-02 8.2101600e-02 8.2117800e-02 8.2125900e-02 8.2131300e-02 8.2107600e-02 8.2146900e-02 8.2122400e-02 8.2111800e-02 8.2156100e-02 8.2088500e-02 8.2135300e-02 8.2119700e-02 8.2100800e-02 8.2135700e-02 8.2126900e-02 8.2134000e-02 8.2111000e-02 8.2101600e-02 8.2108600e-02 8.2142900e-02 8.2091000e-02 8.2117700e-02 8.2061400e-02 8.2085200e-02 8.2080400e-02 8.2075400e-02 8.2064400e-02 8.2059700e-02 8.2098200e-02 8.2077200e-02 8.2138200e-02 8.2116300e-02 8.2092000e-02 8.2071900e-02 8.2092500e-02 8.2056900e-02 8.2108900e-02 8.2061300e-02 8.2064300e-02 8.2063900e-02 8.2120600e-02 8.2049500e-02 8.2087300e-02 8.2066800e-02 8.2074900e-02 8.2052400e-02 8.2093200e-02 8.2061800e-02 8.2043700e-02 8.2070500e-02 8.2056900e-02 8.2084000e-02 8.2075900e-02 8.2065900e-02 8.2054200e-02 8.2037400e-02 8.2040600e-02 8.2085500e-02 8.2029000e-02 8.2057000e-02 8.2045700e-02 8.2112600e-02 8.2068000e-02 8.2034900e-02 8.2045200e-02 8.2046400e-02 8.2067300e-02 8.2080500e-02 8.2021400e-02 8.2047300e-02 8.2060200e-02 8.2042900e-02 8.2065200e-02 8.2056100e-02 8.1990900e-02 8.2055700e-02 8.2030300e-02 8.2103400e-02 8.2092600e-02 8.1995200e-02 8.2075300e-02 8.2001500e-02 8.2064000e-02 8.2033500e-02 8.2042800e-02 8.2037400e-02 8.2002000e-02 8.2057900e-02 8.2025100e-02 8.2038900e-02 8.2035200e-02 8.2005700e-02 8.2016700e-02 8.2012800e-02 8.1984900e-02 8.2066200e-02 8.2029600e-02 8.2027400e-02 8.2012200e-02 8.2009400e-02 8.2024900e-02 8.2038700e-02 8.2034700e-02 8.2016200e-02 8.1964500e-02 8.2019400e-02 8.2010500e-02 8.2004100e-02 8.2057500e-02 8.2052300e-02 8.2004500e-02 8.1998400e-02 8.2011600e-02 8.2038400e-02 8.2002500e-02 8.2005700e-02 8.2065900e-02 8.1991200e-02 8.2039900e-02 8.2028200e-02 8.2027000e-02 8.2021300e-02 8.2019600e-02 8.2032900e-02 8.2011700e-02 8.2017400e-02 8.2069400e-02 8.1998400e-02 8.2059400e-02 8.1958300e-02 8.1995800e-02 8.2018500e-02 8.1973400e-02 8.2008800e-02 8.1995900e-02 8.1989400e-02 8.1991800e-02 8.2000600e-02 8.2040400e-02 8.2035700e-02 8.1987800e-02 8.2027400e-02 8.2010800e-02 8.1991300e-02 8.1999400e-02 8.1926800e-02 8.2021100e-02 8.1967800e-02 8.1992600e-02 8.2022200e-02 8.1933100e-02 8.1998900e-02 8.2004300e-02 8.1991300e-02 8.2039500e-02 8.1998900e-02 8.2005400e-02 8.1997600e-02 8.1954500e-02 8.2000000e-02 8.1978000e-02 8.1990800e-02 8.1966200e-02 8.1997400e-02 8.2028700e-02 8.1957700e-02 8.2013700e-02 8.2052000e-02 8.1961400e-02 8.2007200e-02 8.1984800e-02 8.1999600e-02 8.2041800e-02 8.1990100e-02 8.2014500e-02 8.2008300e-02 8.1980400e-02 8.2000800e-02 8.1988200e-02 8.1979900e-02 8.2003400e-02 8.1921000e-02 8.1985600e-02 8.1995500e-02 8.1951000e-02 8.2006500e-02 8.1977500e-02 8.2005200e-02 8.2000100e-02 8.1938300e-02 8.1993000e-02 8.1983800e-02 8.1995600e-02 8.1992500e-02 8.1976700e-02 8.2020400e-02 8.1986800e-02 8.1990200e-02 8.2007100e-02 8.1957500e-02 8.2021900e-02 8.1954900e-02 8.1995800e-02 8.1993800e-02 8.1992400e-02 8.1970100e-02 8.1989200e-02 8.1998800e-02 8.1991700e-02 8.1970500e-02 8.2000800e-02 8.1938300e-02 8.1965400e-02 8.1985000e-02 8.1930300e-02 8.1970600e-02
错误如下所述。
追踪(最近一次通话): 文件" C:\ WinPython-32bit-2.7.5.3 \ python学习文件\ python 2.7 DSP \ read_the_input_signal_with_certain_frequency.py",第65行,in y = butter_bandpass_filter(v_numbers,lowcut,highcut,fs,order = 6) 文件" C:\ WinPython-32bit-2.7.5.3 \ python学习文件\ python 2.7 DSP \ read_the_input_signal_with_certain_frequency.py",第14行,在butter_bandpass_filter中 y = lfilter(b,a,数据) 文件" C:\ WinPython-32bit-2.7.5.3 \ python-2.7.5 \ lib \ site-packages \ scipy \ signal \ signaltools.py",第565行,在lfilter中 return sigtools._linear_filter(b,a,x,axis)
由于
答案 0 :(得分:2)
在这部分代码中:
f = open('NIRS_data.txt','r')
number_string = f.readline()
v_numbers = []
while number_string != '':
numbers = number_string.split()
for number in numbers:
v_numbers.append( number )
number_string = f.readline()
您尚未将字段转换为浮点值,因此v_numbers
是字符串列表。使用此列表调用lfilter
时会发生错误。
您可以将通话更改为append
至
v_numbers.append(float(number))
如果文件中的每一行具有相同数量的字段,则更好的解决方案是通过调用np.loadtxt
来完全替换读取文件的代码。也就是说,
v_numbers = np.loadtxt('NIRS_data.txt').ravel()