forked from Mirrors/freeswitch
41 lines
1.2 KiB
Matlab
41 lines
1.2 KiB
Matlab
% gen_rn_coeffs.m
|
|
% David Rowe 13 april 2012
|
|
%
|
|
% Generate root raised cosine (Root Nyquist) filter coefficients
|
|
% thanks http://www.dsplog.com/db-install/wp-content/uploads/2008/05/raised_cosine_filter.m
|
|
|
|
function coeffs = gen_rn_coeffs(alpha, T, Rs, Nsym, M)
|
|
|
|
Ts = 1/Rs;
|
|
|
|
n = -Nsym*Ts/2:T:Nsym*Ts/2;
|
|
Nfilter = Nsym*M;
|
|
Nfiltertiming = M+Nfilter+M;
|
|
|
|
sincNum = sin(pi*n/Ts); % numerator of the sinc function
|
|
sincDen = (pi*n/Ts); % denominator of the sinc function
|
|
sincDenZero = find(abs(sincDen) < 10^-10);
|
|
sincOp = sincNum./sincDen;
|
|
sincOp(sincDenZero) = 1; % sin(pix/(pix) =1 for x =0
|
|
|
|
cosNum = cos(alpha*pi*n/Ts);
|
|
cosDen = (1-(2*alpha*n/Ts).^2);
|
|
cosDenZero = find(abs(cosDen)<10^-10);
|
|
cosOp = cosNum./cosDen;
|
|
cosOp(cosDenZero) = pi/4;
|
|
gt_alpha5 = sincOp.*cosOp;
|
|
Nfft = 4096;
|
|
GF_alpha5 = fft(gt_alpha5,Nfft)/M;
|
|
|
|
% sqrt causes stop band to be amplified, this hack pushes it down again
|
|
|
|
for i=1:Nfft
|
|
if (abs(GF_alpha5(i)) < 0.02)
|
|
GF_alpha5(i) *= 0.001;
|
|
endif
|
|
end
|
|
GF_alpha5_root = sqrt(abs(GF_alpha5)) .* exp(j*angle(GF_alpha5));
|
|
ifft_GF_alpha5_root = ifft(GF_alpha5_root);
|
|
coeffs = real((ifft_GF_alpha5_root(1:Nfilter)));
|
|
endfunction
|