mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 13:00:26 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*---------------------------------------------------------------------------*\
 | |
| 
 | |
|   FILE........: ofdm_internal.h
 | |
|   AUTHORS.....: David Rowe & Steve Sampson
 | |
|   DATE CREATED: June 2017
 | |
| 
 | |
|   OFDM Internal definitions.
 | |
| 
 | |
| \*---------------------------------------------------------------------------*/
 | |
| 
 | |
| /*
 | |
|   Copyright (C) 2017 David Rowe
 | |
| 
 | |
|   All rights reserved.
 | |
| 
 | |
|   This program is free software; you can redistribute it and/or modify
 | |
|   it under the terms of the GNU Lesser General Public License version 2.1, as
 | |
|   published by the Free Software Foundation.  This program is
 | |
|   distributed in the hope that it will be useful, but WITHOUT ANY
 | |
|   WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | |
|   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
 | |
|   License for more details.
 | |
| 
 | |
|   You should have received a copy of the GNU Lesser General Public License
 | |
|   along with this program; if not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| #ifndef OFDM_INTERNAL_H
 | |
| #define OFDM_INTERNAL_H
 | |
| 
 | |
| #include <complex.h>
 | |
| #include <stdbool.h>
 | |
| #include <stdint.h>
 | |
| 
 | |
| #include "codec2_ofdm.h"
 | |
| #include "freedv_filter.h"
 | |
| #include "fdv_arm_math.h"
 | |
| 
 | |
| #ifndef M_PI
 | |
| #define M_PI        3.14159265358979323846f
 | |
| #endif
 | |
| 
 | |
| #define TAU         (2.0f * M_PI)
 | |
| #define ROT45       (M_PI / 4.0f)
 | |
| 
 | |
| #define cmplx(value) (std::complex<float>{cos(value), sin(value)})
 | |
| #define cmplxconj(value) (std::complex<float>{cos(value), -sin(value)})
 | |
| 
 | |
| namespace FreeDV
 | |
| {
 | |
| 
 | |
| /*
 | |
|  * Contains user configuration for OFDM modem
 | |
|  */
 | |
| 
 | |
| struct OFDM_CONFIG {
 | |
|     float tx_centre; /* TX Centre Audio Frequency */
 | |
|     float rx_centre; /* RX Centre Audio Frequency */
 | |
|     float fs;  /* Sample Frequency */
 | |
|     float rs;  /* Modulation Symbol Rate */
 | |
|     float ts;  /* symbol duration */
 | |
|     float tcp; /* Cyclic Prefix duration */
 | |
|     float ofdm_timing_mx_thresh;
 | |
| 
 | |
|     int nc;  /* Number of carriers */
 | |
|     int ns;  /* Number of Symbol frames */
 | |
|     int bps;   /* Bits per Symbol */
 | |
|     int txtbits; /* number of auxiliary data bits */
 | |
|     int ftwindowwidth;
 | |
| };
 | |
| 
 | |
| struct OFDM {
 | |
|     std::complex<float> *pilot_samples;
 | |
|     std::complex<float> *rxbuf;
 | |
|     std::complex<float> *pilots;
 | |
|     std::complex<float> **rx_sym;
 | |
|     std::complex<float> *rx_np;
 | |
| 
 | |
|     float *rx_amp;
 | |
|     float *aphase_est_pilot_log;
 | |
| 
 | |
|     uint8_t *tx_uw;
 | |
| 
 | |
|     State sync_state;
 | |
|     State last_sync_state;
 | |
|     State sync_state_interleaver;
 | |
|     State last_sync_state_interleaver;
 | |
| 
 | |
|     Sync sync_mode;
 | |
| 
 | |
|     struct quisk_cfFilter *ofdm_tx_bpf;
 | |
| 
 | |
|     std::complex<float> foff_metric;
 | |
| 
 | |
|     float foff_est_gain;
 | |
|     float foff_est_hz;
 | |
|     float timing_mx;
 | |
|     float coarse_foff_est_hz;
 | |
|     float timing_norm;
 | |
|     float sig_var;
 | |
|     float noise_var;
 | |
|     float mean_amp;
 | |
| 
 | |
|     int clock_offset_counter;
 | |
|     int verbose;
 | |
|     int sample_point;
 | |
|     int timing_est;
 | |
|     int timing_valid;
 | |
|     int nin;
 | |
|     int uw_errors;
 | |
|     int sync_counter;
 | |
|     int frame_count;
 | |
| 
 | |
|     int frame_count_interleaver;
 | |
| 
 | |
|     bool sync_start;
 | |
|     bool sync_end;
 | |
|     bool timing_en;
 | |
|     bool foff_est_en;
 | |
|     bool phase_est_en;
 | |
|     bool tx_bpf_en;
 | |
| };
 | |
| 
 | |
| /* function headers exposed for LDPC work */
 | |
| 
 | |
| std::complex<float> qpsk_mod(int *);
 | |
| void qpsk_demod(std::complex<float>, int *);
 | |
| void ofdm_txframe(struct OFDM *, std::complex<float> *, std::complex<float> []);
 | |
| void ofdm_assemble_modem_frame(struct OFDM *, uint8_t [], uint8_t [], uint8_t []);
 | |
| void ofdm_assemble_modem_frame_symbols(std::complex<float> [], COMP [], uint8_t []);
 | |
| void ofdm_disassemble_modem_frame(struct OFDM *, uint8_t [], COMP [], float [], short []);
 | |
| void ofdm_rand(uint16_t [], int);
 | |
| void ofdm_generate_payload_data_bits(uint8_t payload_data_bits[], int data_bits_per_frame);
 | |
| 
 | |
| } // FreeDV
 | |
| 
 | |
| #endif
 |