數字信號處理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);