dan@0: % create dan@0: function [A_sys,b_sys,sig_fft] = ddm_lin_sys_fft(Q, R, win, win_der, mf_ders, sig, N, N_fft, fs) dan@0: %% START: comment this out for better performance dan@0: assert(size(mf_ders,1) == N ); dan@0: assert(size(mf_ders, 2) == R); dan@0: assert(size(win,1) == N ); dan@0: assert(size(win,2) == 1 ); dan@0: assert(size(win_der,1) == N ); dan@0: assert(size(win_der,2) == 1 ); dan@0: assert(size(sig,1) == N ); dan@0: assert(size(sig,2) == 1 ); dan@0: assert(N <= N_fft); dan@0: %% START: comment this out for better performance dan@0: dan@0: win_mat = repmat(win, 1, R); dan@0: frqs_fft = [0:N_fft-1]'*fs*2*pi/N_fft; dan@0: [str_idx end_idx] = zpzh_idxs(N); dan@0: sig_mat = repmat(sig, 1, R); dan@0: dan@0: dan@0: fft_sig_mat_bffr = win_mat .* sig_mat .* mf_ders; dan@0: fft_sig_win_der_bffr = win_der .* sig; % usefull hack to easily compute derivative of the matrix dan@0: fft_sig_win_der = fft([fft_sig_win_der_bffr(str_idx,:);zeros(N_fft-N,1);fft_sig_win_der_bffr(end_idx,:)],N_fft,1); dan@0: A = fft([fft_sig_mat_bffr(str_idx,:);zeros(N_fft-N,R);fft_sig_mat_bffr(end_idx,:)], N_fft, 1); %zero padded sheezl dan@0: b = -(fft_sig_win_der - 1j*frqs_fft.* A(:,1)); dan@0: % create the actual matrixes dan@0: A_sys = zeros(Q,R,N_fft-Q+1); dan@0: b_sys = zeros(Q,1,N_fft-Q+1); dan@0: for k=1:Q dan@0: A_sys(k,:,:) = shiftdim(A(k:N_fft-Q+k,:).',-1); dan@0: b_sys(k,:,:) = shiftdim(b(k:N_fft-Q+k).',-1); dan@0: end dan@0: sig_fft = A(:,1); dan@0: end