refactoring hf model
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 18 Jun 2014 11:11:00 +0000 (11:11 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 18 Jun 2014 11:11:00 +0000 (11:11 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1672 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/hf_sim.m

index 90458283822904fc78b956568d24ad7a0ae7ff0a..c9105c005fbd6f2e20ce91fe08ff075196c44685 100644 (file)
@@ -1,40 +1,52 @@
 % hf_sim.m
 % David Rowe March 2014
 %
-% HF channel simulation.
+% Two path CCIR poor HF channel simulation, with apaologies to PathSim
 
-function sim_out = hf_sim(sim_in, snr3kHz)
+% Init HF channel model from stored sample files of spreading signal ----------------------------------
 
-    % Init HF channel model from stored sample files of spreading signal ----------------------------------
+global spread;
+global spread_2ms;
+global hf_gain;
 
-    % convert "spreading" samples from 1kHz carrier at Fs to complex
-    % baseband, generated by passing a 1kHz sine wave through PathSim
-    % with the ccir-poor model, enabling one path at a time.
+% convert "spreading" samples from 1kHz carrier at Fs to complex
+% baseband, generated by passing a 1kHz sine wave through PathSim with
+% the ccir-poor model, enabling one path at a time.  Because I'm too
+% lazy to generate my own spreading signals
     
-    Fc = 1000; Fs=8000;
-    fspread = fopen("../raw/sine1k_2Hz_spread.raw","rb");
-    spread1k = fread(fspread, "int16")/10000;
-    fclose(fspread);
-    fspread = fopen("../raw/sine1k_2ms_delay_2Hz_spread.raw","rb");
-    spread1k_2ms = fread(fspread, "int16")/10000;
-    fclose(fspread);
+Fc = 1000; Fs=8000;
+fspread = fopen("../raw/sine1k_2Hz_spread.raw","rb");
+spread1k = fread(fspread, "int16")/10000;
+fclose(fspread);
+fspread = fopen("../raw/sine1k_2ms_delay_2Hz_spread.raw","rb");
+spread1k_2ms = fread(fspread, "int16")/10000;
+fclose(fspread);
 
-    % down convert to complex baseband
-    spreadbb = spread1k.*exp(-j*(2*pi*Fc/Fs)*(1:length(spread1k))');
-    spreadbb_2ms = spread1k_2ms.*exp(-j*(2*pi*Fc/Fs)*(1:length(spread1k_2ms))');
+% down convert to complex baseband
 
-    % remove -2000 Hz image
-    b = fir1(50, 5/Fs);
-    spread = filter(b,1,spreadbb);
-    spread_2ms = filter(b,1,spreadbb_2ms);
+spreadbb = spread1k.*exp(-j*(2*pi*Fc/Fs)*(1:length(spread1k))');
+spreadbb_2ms = spread1k_2ms.*exp(-j*(2*pi*Fc/Fs)*(1:length(spread1k_2ms))');
 
-    % discard first 1000 samples as these were near 0, probably as
-    % PathSim states were ramping up
+% remove -2000 Hz image
 
-    spread    = spread(1000:length(spread));
-    spread_2ms = spread_2ms(1000:length(spread_2ms));
+b = fir1(50, 5/Fs);
+spread = filter(b,1,spreadbb);
+spread_2ms = filter(b,1,spreadbb_2ms);
 
-    hf_gain = 1.0/sqrt(var(spread)+var(spread_2ms));
+% discard first 1000 samples as these were near 0, probably as
+% PathSim states were ramping up
+
+spread     = spread(1000:length(spread));
+spread_2ms = spread_2ms(1000:length(spread_2ms));
+
+hf_gain = 1.0/sqrt(var(spread)+var(spread_2ms));
+
+% This function simulates the HF channel at 8kHz for real signals.  A
+% good use case is passing a vector of speech samples through it to
+% simulate SSB over HF.  There's a really good reason for the 300 -
+% 3000 Hz filter that escapes me right now :-)
+
+function [sim_out snr3kHz_measured ] = hf_sim_real(sim_in, snr3kHz)
 
     % 300 - 3000 Hz filter
 
@@ -61,14 +73,6 @@ function sim_out = hf_sim(sim_in, snr3kHz)
     filtered_noise = filter(b,1,noise);
  
     sim_out = real(combined+filtered_noise);
-    printf("measured SNR: %3.2fdB\n", 10*log10(var(real(combined))/var(real(filtered_noise))));
-
-    figure(1);
-    plot(s);
-    figure(2)
-    plot(real(combined))
-    figure(2)
-    plot(sim_out)
-
+    snr3kHz_measured = 10*log10(var(real(combined))/var(real(filtered_noise)));
 endfunction