Complex FIR digital filter design using a complex least squares criterion (complex filter coefficients, possibly non-linear phase)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function h = cfirls(N,f,d,w) | |
% function h = cfirls(N,f,d,w) | |
% complex FIR filter design using a least squares criterion | |
% the desired response doesn't need to have a linear phase | |
% | |
% h complex-valued impulse response | |
% N desired filter length | |
% f frequency grid -1 <= f <= 1 ( '1' corresponds to Nyquist) | |
% d desired complex-valued frequency response on the grid f | |
% w (positive) weighting function on the grid f | |
% | |
% EXAMPLE 1 (design of linear phase complex-valued filter): | |
% N = 51; % desired filter length | |
% f = [linspace(-1,-.18,164),linspace(-.1,.3,80),linspace(.38,1,124)]; % frequency grid | |
% d = [zeros(1,164),ones(1,80),zeros(1,124)].*exp(-1i*pi*f*(N-1)/2); % desired frequency response | |
% w = [10*ones(1,164),ones(1,80),10*ones(1,124)]; % weighting function | |
% h = cfirls(N,f,d,w); | |
% | |
% EXAMPLE 2 (like EXAMPLE 1 but with a reduced delay / non-linear phase): | |
% N = 51; % desired filter length | |
% tau = 20; % desired passband group delay | |
% f = [linspace(-1,-.18,164),linspace(-.1,.3,80),linspace(.38,1,124)]; % frequency grid | |
% d = [zeros(1,164),ones(1,80),zeros(1,124)].*exp(-1i*pi*f*tau); % desired frequency response | |
% w = [10*ones(1,164),ones(1,80),10*ones(1,124)]; % weighting function | |
% h = cfirls(N,f,d,w); | |
% | |
% author: Mathias C. Lang, 2018-01-01 | |
% mattsdspblog@gmail.com | |
% check arguments | |
L = length(f); | |
if ( length(d) ~= L ), error('d and f must have the same lengths.'); end | |
if ( length(w) ~= L ), error('w and f must have the same lengths.'); end | |
if ( N < 1 ), error('N must be greater than 0.'); end | |
f = f(:); d = d(:); w = w(:); | |
% set up complex-valued overdetermined linear system and solve in a least squares sense | |
A = w(:,ones(1,N)) .* exp(-1i*pi*f*(0:N-1) ); | |
h = A \ (w.*d); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment