diff options
| author | Author Name <[email protected]> | 2023-07-07 12:20:59 +0930 |
|---|---|---|
| committer | David Rowe <[email protected]> | 2023-07-07 12:29:06 +0930 |
| commit | ac7c48b4dee99d4c772f133d70d8d1b38262fcd2 (patch) | |
| tree | a2d0ace57a9c0e2e5b611c4987f6fed1b38b81e7 /octave/doppler_spread.m | |
shallow zip-file copy from codec2 e9d726bf20
Diffstat (limited to 'octave/doppler_spread.m')
| -rw-r--r-- | octave/doppler_spread.m | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/octave/doppler_spread.m b/octave/doppler_spread.m new file mode 100644 index 0000000..b6fccf5 --- /dev/null +++ b/octave/doppler_spread.m @@ -0,0 +1,38 @@ +% 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 + + |
