Два цифровых фильтра нижних частот неправильно установлены в Python - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь реализовать 2 фильтра нижних частот и вижу разницу между ними и графиками (один КИХ-фильтр, который должен быть разработан с использованием метода окна Ханна, и БИХ-фильтр с использованием Чебышева I типа). Проблема в том, что я не могу сделать 2 правильных графика, чтобы увидеть разницу между ними, и я не знаю точно, правильно ли они реализованы ... У меня fc1, fc2, ft, rp и rs в качестве параметров. Вот мой python код:

        import matplotlib.pyplot as plt
        import scipy.signal as signal
        import numpy as np

        def plotInTime(x,fs):
            t=np.arange(0,np.size(x,0)/fs,1/fs)
            plt.figure()
            plt.plot(t,x)
            plt.xlabel('Time (s)')
            plt.ylabel('Amplitude')
            plt.grid(True)

def plotInFrequency(x,fs):
    N=int(np.size(x,0)/2)
    if np.size(x,0)==1:
    X=np.fft.fft(x,axis=1)
    else:
    X=np.fft.fft(x,axis=0)
    X=np.abs(X)
    X=X[:N]
    f=np.arange(0,fs/2,fs/2/N)
    plt.figure()
    plt.plot(f,X)
    plt.xlabel('Frequency (Hz)')
    plt.ylabel('Magnitude')
    plt.grid(True)


    #main driver code
        fs, x = myDSP.readWav('Ring05c.wav') #is 22050
        plotInTime(x,fs)
        plt.title('Original Signal')
        plotInFrequency(x,fs)
        plt.title('Spectrum for the Original Signal')

        fc1=1200
        fc2=3000
        fc= np.arange(fc1,fc2+1)
        ft=150
        rp=0.1
        rs=40
        t = np.linspace(-1, 1, 201)
        #x = (np.sin(2*np.pi*0.75*t*(1-t) + 2.1)+0.1*np.sin(2*np.pi*1.25*t + 1) +0.18*np.cos(2*np.pi*3.85*t))
        wp=(fc-ft/2)/(fs/2)
        wp = wp[0]
        ws=(fc+ft/2)/(fs/2)
        ws = ws[0]
        L, Wn = signal.cheb1ord(wp,ws, rp, rs);
        b, a = signal.cheby1(L, rp, Wn,'low')
        f,H=signal.freqz(b,a,worN=256,plot=None,fs=fs)    

        y=signal.lfilter(b,a,x,axis=0)
        plotInTime(y,fs)
        plt.title('Filtered Cheby1 Signal')

        plotInFrequency(y,fs)
        plt.title('Spectrum for the Filtered Cheby1 Signal')
        y=y.astype('int16')

        w_fir = signal.firwin(65, fc/(fs/2), window='hann')
    [w,h] = signal.freqz(w_fir)
    plt.plot(w, 20*np.log10(abs(h)))
    plt.plot(w, np.angle(h))

plot difference

...