aboutsummaryrefslogtreecommitdiff
path: root/octave/doppler_spread.m
diff options
context:
space:
mode:
authorMarin Ivanov <[email protected]>2025-07-25 10:17:14 +0300
committerMarin Ivanov <[email protected]>2026-01-18 20:09:26 +0200
commit0168586485e6310c598713c911b1dec5618d61a1 (patch)
tree6aabc2a12ef8fef70683f5389bea00f948015f77 /octave/doppler_spread.m
Initial commitHEADmaster
* codec2 cut-down version 1.2.0 * Remove codebook and generation of sources * remove c2dec c2enc binaries * prepare for emscripten
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
+
+