aboutsummaryrefslogtreecommitdiff
path: root/octave/doppler_spread.m
diff options
context:
space:
mode:
authorAuthor Name <[email protected]>2023-07-07 12:20:59 +0930
committerDavid Rowe <[email protected]>2023-07-07 12:29:06 +0930
commitac7c48b4dee99d4c772f133d70d8d1b38262fcd2 (patch)
treea2d0ace57a9c0e2e5b611c4987f6fed1b38b81e7 /octave/doppler_spread.m
shallow zip-file copy from codec2 e9d726bf20
Diffstat (limited to 'octave/doppler_spread.m')
-rw-r--r--octave/doppler_spread.m38
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
+
+