如何在 MATLAB 中执行这种谱分解?

信息处理 matlab 过滤器 离散信号 z变换
2022-02-07 19:27:43

给定一个过滤器X(z)我想找到G(z)使得它是稳定的、因果的和最小的相位,并且它实现了

X(z)=K0G(z)G(1/z)

在哪里K0R. 当然,G(1/z)然后将是反因果和最大相位。过滤器x[n]复系数

我试图在 MATLAB 中实现这一点,但我发现它比我想象的要困难。

% This is my filter x[n]. You can try with any coefficients, it doesn't matter
x = dfilt.dffir(q_k + 1/(10^(SNR_MFB/10)));
% Here I find its zeros
zeros_x = zpk(x);
% And now I identify those who are inside and outside the unit circle
zeros_min = zeros_x(abs(zeros_x) < 1);
zeros_max = zeros_x(abs(zeros_x) > 1);
% Now I wanted to build the filter g[n] using this information but don't know how

我尝试使用spectralfact(),但它不支持具有复杂系数的输入。

有谁知道如何获得系数g[n]?

1个回答

因式分解

(2)X(z)=G(z)G*(1z*)

最小相位G(z)只有当X(z)是一个非负实函数,即X(z)在单位圆上是非负实数|z|=1.

以下 Octave/Matlab 脚本是一个简单的示例,说明如何查找G(z)从给定的X(z)(注意X[n]是复值):

N = 10;         % signal length is 2*N-1
x = randn(N,1) + 1i*randn(N,1);
x = conv(x,conj(x(end:-1:1)));
% x has conjugate symmetry and its spectrum is non-negative

r = roots(x);
I = find( abs(r) < 1 );
ri = r(I);
g = poly(ri);
K = real(x(N))/real(g(:)'*g(:));

x2 = K * conv(g,conj(g(end:-1:1)));    % same as x up to numerical errors