2015-07-31 2 views
1

Я пытаюсь создать полосовой фильтр, используя scipy, но я продолжаю получать сингулярную матричную ошибку LinAlg. Я читал, что сингулярная матрица - это та, которая не является инвертируемой, но я не уверен, как эта ошибка подходит и что я могу сделать, чтобы исправить ее.python bandpass filter - сингулярная матричная ошибка

Код принимает сигнал ЭЭГ (который в коде ниже, я только что заменил массив int для тестирования) и отфильтровывает частоты < 8Hz и> 12Hz (альфа-диапазон)

Может ли кто-нибудь пролить свет на то, откуда происходит сингулярная матричная ошибка? Или же, если вы знаете лучший способ для фильтрации сигнала, как это я хотел бы, чтобы проверить другие варианты

from scipy import signal 
from scipy.signal import filter_design as fd 
import matplotlib.pylab as plt 

#bandpass 
Wp = [8, 12] # Cutoff frequency 
Ws = [7.5, 12.5] # Stop frequency 
Rp = 1    # passband maximum loss (gpass) 
As = 100    # stoppand min attenuation (gstop) 

b,a = fd.iirdesign(Wp,Ws,Rp,As,ftype='butter') 
w,H = signal.freqz(b,a) # filter response 
plt.plot(w,H) 

t = np.linspace(1,256,256) 
x = np.arange(256) 
plt.plot(t,x) 

y = signal.filtfilt(b,a,x) 
plt.plot(t,y) 
+0

отслеживающий должен показать вам, какая линия является причиной проблемы. Вы можете поместить вокруг него блок try/except и распечатать/записать информацию об объекте. Вы также можете ознакомиться с [pdb] (https://docs.python.org/3/library/pdb.html) и попытаться использовать его для косвенного объекта (ов), вызывающего проблему. – wwii

ответ

2

Как указано в iirdesign documentation, Wp и Ws являются «нормализованы от 0 до 1, где 1 - частота Найквиста ».

Если частота дискретизации Fs (например, 100Гц), вы можете нормализовать отсечку и остановить частоты использования:

Wp = [x/(Fs/2.0) for x in Wp] 
Ws = [x/(Fs/2.0) for x in Ws] 
+0

ах, спасибо! Я столкнулся с второй проблемой, когда он сказал, что мой входной вектор x должен быть, по крайней мере, размером padlen, учитывая, что у меня только 256 точек на последовательность, я установил padlen = 0 ... есть ли какие-либо проблемы с этим? Почему требуется заполнение? – Simon

Смежные вопросы