C語言計算數字濾波器的幅頻響應和相頻響應


數字信號處理C語言程序集,P168

方法簡介:

子函數語句:

void gain(double b[], double a[], int m, int n, double x[], double y[], int len, int sign)

系數介紹:

b:長度為m+1,存放濾波器分子多項式的系數b(i)
a:長度為n+1,存放濾波器分母多項式的系數a(i)
m: 濾波器分子多項式的階數
n: 濾波器分母多項式的階數
x: 長度為len,sign為0時,存放濾波器頻率響應的實部Re[H(w)],當sign=1時,存放濾波器幅度響應|H(w)|;當sign=2時,存放用分貝表示的濾波器幅頻響應|H(w)|
y:長度為len,當sign=0時,存放濾波器頻率響應的虛部Im[H(w)],當sign=1和2時,存放濾波器的相頻響應
len:頻率響應的長度
sign:當sign=0時,計算濾波器頻率響應的實部Re[H(w)]和虛部Im[H(w)],當sign=1時,計算濾波器的幅頻響應|H(w)|和相頻響應;當sign=2時,計算濾波器的幅頻響應|H(w)|和相頻響應。

子程序代碼如下:

void gain(double b[], double a[], int m, int n, double x[], double y[], int len, int sign)
{
    int i, k;
    double ar, ai, br, bi, zr, zi, im, re, den, numr, numi, freq, temp;
    for (k=0; k<len; k++)
    {
        freq = k * 0.5 / (len - 1);
        zr = cos(-8.0 * atan(1.0) * freq);
        zi = sin(-8.0 * atan(1.0) * freq);
        br = 0.0;
        bi = 0.0;
        for (i=m; i>0; i--)
        {
            re = br;
            im = bi;
            br = (re + b[i]) * zr - im * zi;
            bi = (re + b[i]) * zi + im * zr;
        }
        ar = 0.0;
        ai = 0.0;
        for (i=n; i>0; i--)
        {
            re = ar;
            im = ai;
            ar = (re + a[i]) * zr - im * zi;
            ai = (re + a[i]) * zi + im * zr;
        }
        br = br + b[0];
        ar = ar + 1.0;
        numr = ar * br + ai * bi;
        numi = ar * bi - ai * br;
        den = ar * ar + ai * ai;
        x[k] = numr / den;
        y[k] = numi / den;
        switch (sign)
        {
         case 1:
         {
            temp = sqrt(x[k] * x[k] + y[k] * y[k]);
            y[k] = atan2(y[k], x[k]);
            x[k] = temp;
            break;
         }
         case 2:
         {
            temp = x[k] * x[k] + y[k] * y[k];
            y[k] = atan2(y[k], x[k]);
            x[k] = 10.0 * log10(temp);
         }
        }
    }
}

例如:

數字系統的傳遞函數為:
求該系統的幅頻響應和相頻響應,並畫出相應的圖形。

我是利用Qt5.9實現的。列舉主要代碼。繪圖利用的是QCustomPlot。

double a[] = {1.0, 0.0, 0.9};
double b[] = {0.0, -0.1};
double x[300];
double y[300];
gain(b, a, 1, 2, x, y, 300, 1);

數字系統的幅頻響應:

數字系統的相頻響應:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM