如何使用希比。信号。黄油&过滤器?

2024-07-05 14:47:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个程序,它的目的是用巴特沃斯滤波器过滤噪声信号。代码如下所示。程序无法被编译,因为我在最后一步做了错误的“y=butter_带通滤波器(v_numbers,lowcut,highcut,fs,order=6)”。 我想要得到三个图:1。时域输入信号,2。频率域中的巴特沃斯滤波器。三。输出时域滤波信号。在

你能帮我解决这个问题吗?谢谢

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.21625000E-02 8.2157700e-02 8.2177900e-02 8.2177600e-02 8.2088400e-02 8.2142900e-02 邮编:60021798 8.2159200e-02 8.2144800e-02 8.213900E-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.211800E-02 8.2156100e-02 8.2088500e-02 8.2135300e-02 8.2119700 E-02 8.2100000E-02 8.2135700e-02 8.2126900e-02 8.2134000 E-02 8.21111000E-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 邮编:2108902 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.205420E-02 8.2037400e-02号 8.2040600e-02 8.2085500e-02 8.2029000e-02 8.205700E-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 1998年9月9日 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 东经1968年2月45002日 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.20000600E-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 82000000E-02 8.1978000e-02 8.1990800e-02 8.1966200e-02 8.1997400e-02 8.2028700e-02 1957年8月700E-02 8.2013700e-02 8.2052000e-02 8.1961400e-02 8.2007200e-02 8.1984800e-02 8.1999600e-02 8.2041800e-028.1990100e-02 8.2014500e-02 8.2008300e-02 8.1980400e-02 8.20000800E-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.20000100E-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.195750E-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.20000800E-02 8.1938300e-02 8.1965400e-02 8.1985000e-02 8.1930300e-02 8.1970600e-02


错误说明如下。在

回溯(最近一次呼叫): 文件“C:\WinPython-32bit-2.7.5.3\python learning files\python 2.7 DSP\read_input_signal_with_-certain_频率.py“,第65行,英寸 y=黄油带通滤波器(v_数,低切,高截,fs,阶数=6) 文件“C:\WinPython-32bit-2.7.5.3\python learning files\python 2.7 DSP\read_input_signal_with_-certain_频率.py,第14行,在黄油带通滤波器中 y=L过滤器(b,a,数据) 文件“C:\WinPython-32bit-2.7.5.3\python-2.7.5\lib\site packages\scipy\signal\信号工具.py,第565行,在lfilter中 返回sigtools.\u线性滤波器(b,a,x,axis)

ValueError:数据类型必须提供itemsize

谢谢


Tags: importnumberforsignal信号plotnporder
1条回答
网友
1楼 · 发布于 2024-07-05 14:47:36

在本部分代码中:

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

^{pr2}$

如果文件中的每一行都有相同数量的字段,更好的解决方案是用调用np.loadtxt完全替换读取文件的代码。也就是说

v_numbers = np.loadtxt('NIRS_data.txt').ravel()

相关问题 更多 >