aboutsummaryrefslogtreecommitdiff
path: root/octave/ofdm_tx.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/ofdm_tx.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/ofdm_tx.m')
-rw-r--r--octave/ofdm_tx.m95
1 files changed, 95 insertions, 0 deletions
diff --git a/octave/ofdm_tx.m b/octave/ofdm_tx.m
new file mode 100644
index 0000000..0683cc9
--- /dev/null
+++ b/octave/ofdm_tx.m
@@ -0,0 +1,95 @@
+% ofdm_tx.m
+% David Rowe March 2018
+%
+% File based, uncoded OFDM tx. Generates a file of ofdm samples,
+% including optional channel simulation. See also ofdm_ldpc_tx.m, and
+% ofdm_mod.c
+
+#{
+ Examples:
+
+ i) 10 seconds, AWGN channel at SNR3k=3dB
+
+ octave:4> ofdm_tx("awgn_snr_3dB_700d.raw", "700D", 10, 3)
+
+ ii) 10 seconds, multipath poor channel at SNR=6dB
+
+ octave:5> ofdm_tx("hf_snr_6dB_700d.raw", "700D", 10, 6, "mpp")
+
+ iii) Data mode example, three bursts of one packet each, SNR=100dB:
+
+ octave:6> ofdm_tx("test_datac0.raw","datac0",1,100,"awgn","bursts",3)
+
+#}
+
+function ofdm_tx(filename, mode="700D", N, SNR3kdB=100, channel='awgn', varargin)
+ ofdm_lib;
+ channel_lib;
+ randn('seed',1);
+ pkg load signal;
+
+ tx_clip_en = 0; freq_offset_Hz = 0.0; burst_mode = 0; Nbursts = 1;
+ i = 1;
+ while i<=length(varargin)
+ if strcmp(varargin{i},"txclip")
+ tx_clip_en = 1;
+ elseif strcmp(varargin{i},"bursts")
+ burst_mode = 1;
+ Nbursts = varargin{i+1}; i++;
+ else
+ printf("\nERROR unknown argument: [%d] %s \n", i ,varargin{i});
+ return;
+ end
+ i++;
+ end
+
+ % init modem
+
+ config = ofdm_init_mode(mode);
+ states = ofdm_init(config);
+ print_config(states);
+ ofdm_load_const;
+
+ if burst_mode
+ % burst mode: treat N as Npackets
+ Npackets = N;
+ else
+ % streaming mode: treat N as Nseconds
+ Npackets = round(N/states.Tpacket);
+ end
+
+ % Generate fixed test frame of tx bits and concatenate packets
+
+ tx_bits = create_ldpc_test_frame(states, coded_frame=0);
+ atx = ofdm_mod(states, tx_bits);
+ tx = [];
+ for f=1:Npackets
+ tx = [tx atx];
+ end
+ if length(states.data_mode)
+ % note postamble provides a "column" of pilots at the end of the burst
+ tx = [states.tx_preamble tx states.tx_postamble];
+ end
+
+ % if burst mode concatenate multiple bursts with spaces
+ if burst_mode
+ atx = tx; tx = zeros(1,states.Fs); on_time = 0; off_time = states.Fs;
+ for b=1:Nbursts
+ tx = [tx atx zeros(1,states.Fs)];
+ on_time += length(atx);
+ off_time += states.Fs;
+ end
+ % adjust channel simulator SNR setpoint given (burst on length)/(total length including silence) ratio
+ mark_space_SNR_offset = 10*log10(on_time/(on_time+off_time));
+ SNRdB_setpoint = SNR3kdB + mark_space_SNR_offset;
+ printf("SNR3kdB: %4.2f Burst offset: %4.2f SNRdB_setpoint: %4.2f\n", SNR3kdB, mark_space_SNR_offset, SNRdB_setpoint)
+ else
+ SNRdB_setpoint = SNR3kdB; % no adjustment to SNR in streaming mode
+ end
+
+ printf("Npackets: %d Nbursts: %d ", Npackets, Nbursts);
+ states.verbose=1;
+ tx = ofdm_hilbert_clipper(states, tx, tx_clip_en);
+ rx_real = ofdm_channel(states, tx, SNRdB_setpoint, channel, freq_offset_Hz);
+ frx = fopen(filename,"wb"); fwrite(frx, rx_real, "short"); fclose(frx);
+endfunction