From: drowe67 Date: Wed, 18 Jun 2014 11:11:00 +0000 (+0000) Subject: refactoring hf model X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=218b6a0e5fcdcfdcef5f4067793c059e6cab11ea;p=freetel-svn-tracking.git refactoring hf model git-svn-id: https://svn.code.sf.net/p/freetel/code@1672 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/hf_sim.m b/codec2-dev/octave/hf_sim.m index 90458283..c9105c00 100644 --- a/codec2-dev/octave/hf_sim.m +++ b/codec2-dev/octave/hf_sim.m @@ -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