SciPy firwin2 имеет низкочастотную ошибку при разработке фильтра произвольной амплитуды - PullRequest
0 голосов
/ 21 февраля 2019

Я пытался разработать КИХ-фильтр с произвольной амплитудой, который имеет конкретное затухание для каждой частоты.

Однако на низкой частоте я получаю ошибку при сравнении результатов с моим ожидаемым откликом фильтра, как видно изрисунок ниже.Не изменяется при повышении порядка фильтра.

Код выглядит следующим образом:

import colorednoise as cn
from matplotlib import pyplot
import numpy
import scipy.signal as signal

# Generates a 3 seconds pink noise
x_raw=cn.powerlaw_psd_gaussian(1, 3*44100)
x_max=numpy.amax(numpy.abs(x_raw))
x=x_raw/x_max
fs=44100

# Vectors of the freq abnds and the corresponding attenuations
freq=numpy.array([0, 25.12, 31.62, 39.81, 50.12, 63.1, 79.43, 100, 125.89, 158.49, 199.53, 251.19, 316.23, 398.11, 501.19, 630.96, 794.33, 1000, 1258.93, 1584.89, 1995.25, 2511.89, 3162.28, 3981.07, 5011.87, 5012, 6309.57, 7943.28, 10000, 12589.25, 15848.93, 19952.62, 22050]);
att=numpy.array([-5.7,-5.7,-5.7,-5.7,-5.7,-2.8,-4.5,-3.9,-7.3,-11.2,-10.4,-11,-10.8,-10.1,-9.8,-7.9,-8.3,-7.7,-10.3,-12.8,-13.9,-15.1,-15.6,-17.3,-18.8,-18.8,-18.8,-18.8,-18.8,-18.8,-18.8,-18.8 ,-18.8])

gain=numpy.power(10,att/20)

b=signal.firwin2(8093,freq,gain,nyq=fs/2)

w,h=signal.freqz(b)
w,h=signal.freqz(b)
f=w*fs/(2*numpy.pi)

####### Plots the filter magnitude response ##########
pyplot.figure(1)
pyplot.plot(f,20*numpy.log10(numpy.abs(h)),label='Filter response')
pyplot.xscale('log')
pyplot.xlabel('Frequência [Hz]')
pyplot.ylabel('Magnitude [dB]')
pyplot.xlim((20,20000))
pyplot.plot(freq,att,label='Desired response')
pyplot.legend()
pyplot.show()

1 Ответ

0 голосов
/ 21 февраля 2019

Длина (или порядок) КИХ-фильтра должна быть приблизительно пропорциональна периоду наименьшей частоты, которую вы хотите изменить с учетом данной ошибки отклика или полосы пропускания перехода.Например, если вам нужна такая же точность настройки на частоту, в 20 раз меньшую, чем текущая частота среднего диапазона, тогда КИХ-фильтр должен быть примерно в 20 раз длиннее, чем подходящий для этого среднего диапазона.

...