freedv-gui/codec2-1.2.0/octave/doppler_spread.m

39 lines
1.0 KiB
Matlab

% doppler_spread.m
% David Rowe Jan 2016
%
% Returns gausssian filtered doppler spreading function samples for HF channel
% modelling. Used PathSim technical guide as a reference - thanks Moe!
function [spread_FsHz states] = doppler_spread(dopplerSpreadHz, FsHz, Nsam)
% start with low Fs so we can work with a reasonable filter length
sigma = dopplerSpreadHz/2;
lowFs = ceil(10*dopplerSpreadHz);
Ntaps = 100;
Nsam_low = ceil(Nsam*lowFs/FsHz + Ntaps); % fill filter memory
% generate gaussian freq response and design filter
x = 0:lowFs/100:lowFs/2;
y = (1/(sigma*sqrt(2*pi)))*exp(-(x.^2)/(2*sigma*sigma));
b = fir2(Ntaps-1, x/(lowFs/2), y);
% generate the spreading samples
spread_lowFs = filter(b,1,randn(1,Nsam_low) + j*randn(1,Nsam_low));
% resample to FsHz, scaling for desired spreadFreqHz
spread_FsHz = resample(spread_lowFs(Ntaps+1:Nsam_low), FsHz, lowFs);
assert(length(spread_FsHz) >= Nsam);
% return some states for optional unit testing
states.x = x;
states.y = y;
states.b = b;
endfunction