codec2_encode_1300(c2, bits, speech);
if (c2->mode == CODEC2_MODE_1200)
codec2_encode_1200(c2, bits, speech);
+#ifndef CORTEX_M4
if (c2->mode == CODEC2_MODE_700)
codec2_encode_700(c2, bits, speech);
if (c2->mode == CODEC2_MODE_700B)
codec2_encode_700b(c2, bits, speech);
+#endif
}
void codec2_decode(struct CODEC2 *c2, short speech[], const unsigned char *bits)
codec2_decode_1300(c2, speech, bits, ber_est);
if (c2->mode == CODEC2_MODE_1200)
codec2_decode_1200(c2, speech, bits);
+#ifndef CORTEX_M4
if (c2->mode == CODEC2_MODE_700)
codec2_decode_700(c2, speech, bits);
if (c2->mode == CODEC2_MODE_700B)
codec2_decode_700b(c2, speech, bits);
+#endif
}
}
+#ifndef CORTEX_M4
/*---------------------------------------------------------------------------*\
FUNCTION....: codec2_encode_700
for(i=0; i<LPC_ORD_LOW; i++)
c2->prev_lsps_dec[i] = lsps[3][i];
}
-
+#endif
/*---------------------------------------------------------------------------*\
f->sz_error_pattern = fdmdv_error_pattern_size(f->fdmdv);
}
+#ifndef CORTEX_M4
if ((mode == FREEDV_MODE_700) || (mode == FREEDV_MODE_700B)) {
f->snr_squelch_thresh = 0.0;
f->squelch_en = 0;
return NULL;
f->sz_error_pattern = cohpsk_error_pattern_size();
}
+#endif
f->test_frame_sync_state = 0;
f->total_bits = 0;
free(freedv->tx_bits);
if (freedv->mode == FREEDV_MODE_1600)
fdmdv_destroy(freedv->fdmdv);
+#ifndef CORTEX_M4
if (freedv->mode == FREEDV_MODE_700)
cohpsk_destroy(freedv->cohpsk);
+#endif
codec2_destroy(freedv->codec2);
free(freedv);
}
}
+#ifndef CORTEX_M4
if ((f->mode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B)) {
bits_per_codec_frame = codec2_bits_per_frame(f->codec2);
bits_per_modem_frame = COHPSK_BITS_PER_FRAME;
for(i=0; i<f->n_nom_modem_samples; i++)
mod_out[i] = fcmult(FDMDV_SCALE*NORM_PWR, tx_fdm[i]);
}
+#endif
}
int freedv_nin(struct freedv *f) {
}
+#ifndef CORTEX_M4
if ((f->mode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B)) {
float rx_bits[COHPSK_BITS_PER_FRAME];
int sync;
//fprintf(stderr, "%d %d %d\n", f->n_speech_samples, speech_out[0], speech_out[nin_prev-1]);
}
}
-
}
+#endif
//fprintf(stderr,"f->stats.sync: %d reliable_sync_bit: %d evenframe: %d nout: %d\n", f->stats.sync, reliable_sync_bit, f->evenframe, nout);
return nout;
{
if (f->mode == FREEDV_MODE_1600)
fdmdv_get_demod_stats(f->fdmdv, &f->stats);
+#ifndef CORTEX_M4
if (f->mode == FREEDV_MODE_700)
cohpsk_get_demod_stats(f->cohpsk, &f->stats);
+#endif
if (sync) *sync = f->stats.sync;
if (snr_est) *snr_est = f->stats.snr_est;
}
// Set integers
void freedv_set_test_frames (struct freedv *f, int val) {f->smooth_symbols = val;}
void freedv_set_squelch_en (struct freedv *f, int val) {f->squelch_en = val;}
+void freedv_zero_total_bit_errors (struct freedv *f) {f->total_bit_errors = 0;}
// Set floats
void freedv_set_snr_squelch_thresh (struct freedv *f, float val) {f->snr_squelch_thresh = val;}
int freedv_get_n_nom_modem_samples (struct freedv *f) {return f->n_nom_modem_samples;}
int freedv_get_total_bits (struct freedv *f) {return f->total_bits;}
int freedv_get_total_bit_errors (struct freedv *f) {return f->total_bit_errors;}
+int freedv_get_sync (struct freedv *f) {return f->stats.sync;}
// Get floats
int freedv_get_n_nom_modem_samples (struct freedv *freedv);
int freedv_get_total_bits (struct freedv *freedv);
int freedv_get_total_bit_errors (struct freedv *freedv);
+void freedv_zero_total_bit_errors (struct freedv *freedv);
+int freedv_get_sync (struct freedv *freedv);
#endif
#ifdef __cplusplus
return lsp_cbd[i].log2m;
}
+#ifndef CORTEX_M4
int mel_bits(int i) {
return mel_cb[i].log2m;
}
int lspmelvq_cb_bits(int i) {
return lspmelvq_cb[i].log2m;
}
+#endif
#ifdef __EXPERIMENTAL__
int lspdt_bits(int i) {
}
+#ifndef CORTEX_M4
/* simple (non mbest) 6th order LSP MEL VQ quantiser. Returns MSE of result */
float lspmelvq_quantise(float *x, float *xq, int order)
xq[i] = codebook1[ndim*n1+i] + codebook2[ndim*n2+i] + codebook3[ndim*n3+i];
}
}
+#endif
int check_lsp_order(float lsp[], int order)
}
+#ifndef CORTEX_M4
+
/*---------------------------------------------------------------------------*\
FUNCTION....: encode_mels_scalar()
}
+#endif
#ifdef __EXPERIMENTAL__
###################################################
-BINPATH=/opt/gcc-arm-none-eabi-4_7-2013q1/bin
-CC=$(BINPATH)/arm-none-eabi-gcc
-OBJCOPY=$(BINPATH)/arm-none-eabi-objcopy
-SIZE=$(BINPATH)/arm-none-eabi-size
+BINPATH=
+CC=$(BINPATH)arm-none-eabi-gcc
+OBJCOPY=$(BINPATH)arm-none-eabi-objcopy
+SIZE=$(BINPATH)arm-none-eabi-size
###################################################
-CFLAGS = -std=gnu99 -O0 -g -Wall -Tstm32_flash.ld -DSTM32F4XX -DCORTEX_M4
+CFLAGS = -std=gnu99 -O0 -g -Wall -Tstm32_flash.ld -DSTM32F40_41xxx -DCORTEX_M4
CFLAGS += -mlittle-endian -mthumb -mthumb-interwork -nostartfiles -mcpu=cortex-m4
ifeq ($(FLOAT_TYPE), hard)
PERIPHLIBURL = http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/
PERIPHLIBZIP = stm32f4_dsp_stdperiph_lib.zip
-PERIPHLIBVER = V1.5.0
+PERIPHLIBVER = V1.4.0
PERIPHLIBNAME = STM32F4xx_DSP_StdPeriph_Lib
PERIPHLIBDIR = $(PERIPHLIBNAME)
CMSIS = $(PERIPHLIBDIR)/Libraries/CMSIS
CFLAGS += -Iinc
FFT_TEST_SRCS = \
-$(DSPLIB)/Examples/arm_fft_bin_example/ARM/arm_fft_bin_data.c \
+$(DSPLIB)/Examples/arm_fft_bin_example/arm_fft_bin_data.c \
fft_test.c \
src/startup_stm32f4xx.s \
stm32f4_machdep.c \
###################################################
-all: libstm32f4.a codec2_profile.elf fft_test.elf dac_ut.elf dac_play.elf adc_rec.elf pwm_ut.elf fdmdv_profile.elf sm1000_leds_switches_ut.elf sm1000.elf adcdac_ut.elf freedv_tx_profile.elf freedv_rx_profile.elf adc_sd.elf usb_vcp_ut.elf fdmdv_dump_rt.elf tuner_ut.elf fast_dac_ut.elf
+all: libstm32f4.a codec2_profile.elf fft_test.elf dac_ut.elf dac_play.elf adc_rec.elf pwm_ut.elf fdmdv_profile.elf sm1000_leds_switches_ut.elf sm1000.elf adcdac_ut.elf freedv_tx_profile.elf freedv_rx_profile.elf adc_sd.elf usb_vcp_ut.elf tuner_ut.elf fast_dac_ut.elf
dl/$(PERIPHLIBZIP):
mkdir -p dl
$(PERIPHLIBDIR): dl/$(PERIPHLIBZIP)
cd dl; unzip $(PERIPHLIBZIP)
- mv dl/$(PERIPHLIBDIR) $(PERIPHLIBDIR)
+ mv dl/$(PERIPHLIBDIR)_$(PERIPHLIBVER) $(PERIPHLIBDIR)
libstm32f4.a: $(PERIPHLIBDIR)
$(MAKE) $(STM32F4TEMPLATE)/system_stm32f4xx.o
COMP rx_fdm[FDMDV_NOM_SAMPLES_PER_FRAME];\r
int i, j, nin, reliable_sync_bit[2], sync_bit, bit_errors, ntest_bits, test_frame_sync;\r
short *error_pattern;\r
- struct FDMDV_STATS stats;\r
+ struct MODEM_STATS stats;\r
PROFILE_VAR(mod_start, demod_start);\r
\r
machdep_profile_init ();\r
\r
int main(int argc, char *argv[]) {\r
struct freedv *f;\r
- short adc16k[FDMDV_OS_TAPS_16K+FREEDV_NSAMPLES_16K];\r
- short dac16k[FREEDV_NSAMPLES_16K];\r
- short adc8k[FREEDV_NSAMPLES];\r
- short dac8k[FDMDV_OS_TAPS_8K+FREEDV_NSAMPLES];\r
FILE *fin, *fout, *ftotal;\r
int frame, nin_16k, nin, i, nout = 0;\r
- struct FDMDV_STATS stats;\r
+ int n_samples, n_samples_16k;\r
+ int sync;\r
+ float snr_est;\r
+\r
PROFILE_VAR(fdmdv_16_to_8_start, freedv_rx_start, fdmdv_8_to_16_start);\r
\r
machdep_profile_init();\r
\r
f = freedv_open(FREEDV_MODE_1600);\r
+ n_samples = freedv_get_n_speech_samples(f);\r
+ n_samples_16k = 2*n_samples;\r
+\r
+ short adc16k[FDMDV_OS_TAPS_16K+n_samples_16k];\r
+ short dac16k[n_samples_16k];\r
+ short adc8k[n_samples];\r
+ short dac8k[FDMDV_OS_TAPS_8K+n_samples];\r
\r
// Receive ---------------------------------------------------------------------\r
\r
\r
nout = freedv_rx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k);\r
nin = freedv_nin(f); nin_16k = 2*nin;\r
- fdmdv_get_demod_stats(f->fdmdv, &stats);\r
\r
PROFILE_SAMPLE_AND_LOG(fdmdv_8_to_16_start, freedv_rx_start, " freedv_rx"); \r
\r
machdep_profile_print_logged_samples();\r
\r
fwrite(dac16k, sizeof(short), 2*nout, fout);\r
- fdmdv_get_demod_stats(f->fdmdv, &stats);\r
+ freedv_get_modem_stats(f, &sync, &snr_est);\r
printf("frame: %d nin_16k: %d sync: %d SNR: %3.2f \n", \r
- ++frame, nin_16k, stats.sync, (double)stats.snr_est);\r
+ ++frame, nin_16k, sync, (double)snr_est);\r
}\r
\r
fclose(fin);\r
\r
int main(int argc, char *argv[]) {\r
struct freedv *f;\r
- short inbuf[FREEDV_NSAMPLES], outbuf[FREEDV_NSAMPLES];\r
FILE *fin, *fout;\r
- int frame;\r
+ int frame, n_samples;\r
PROFILE_VAR(freedv_start);\r
\r
machdep_profile_init();\r
\r
f = freedv_open(FREEDV_MODE_1600);\r
+ n_samples = freedv_get_n_speech_samples(f);\r
+ short inbuf[n_samples], outbuf[n_samples];\r
\r
// Transmit ---------------------------------------------------------------------\r
\r
\r
frame = 0;\r
\r
- while (fread(inbuf, sizeof(short), FREEDV_NSAMPLES, fin) == FREEDV_NSAMPLES) {\r
+ while (fread(inbuf, sizeof(short), n_samples, fin) == n_samples) {\r
PROFILE_SAMPLE(freedv_start);\r
freedv_tx(f, outbuf, inbuf);\r
PROFILE_SAMPLE_AND_LOG2(freedv_start, " freedv_tx"); \r
\r
- fwrite(outbuf, sizeof(short), FREEDV_NSAMPLES, fout);\r
+ fwrite(outbuf, sizeof(short), n_samples, fout);\r
printf("frame: %d\n", ++frame);\r
machdep_profile_print_logged_samples();\r
}\r
\r
int main(void) {\r
struct freedv *f;\r
- short adc16k[FDMDV_OS_TAPS_16K+FREEDV_NSAMPLES_16K];\r
- short dac16k[FREEDV_NSAMPLES_16K];\r
- short adc8k[FREEDV_NSAMPLES];\r
- short dac8k[FDMDV_OS_TAPS_8K+FREEDV_NSAMPLES];\r
SWITCH_STATE ss;\r
int nin, nout, i;\r
+ int n_samples, n_samples_16k;\r
\r
/* init all the drivers for various peripherals */\r
\r
dac_open(4*DAC_BUF_SZ);\r
adc_open(4*ADC_BUF_SZ);\r
f = freedv_open(FREEDV_MODE_1600);\r
+ n_samples = freedv_get_n_speech_samples(f);\r
+ n_samples_16k = 2*n_samples;\r
+\r
+ short adc16k[FDMDV_OS_TAPS_16K+n_samples_16k];\r
+ short dac16k[n_samples_16k];\r
+ short adc8k[n_samples];\r
+ short dac8k[FDMDV_OS_TAPS_8K+n_samples];\r
\r
/* put outputs into a known state */\r
\r
\r
/* ADC2 is the SM1000 microphone, DAC1 is the modulator signal we send to radio tx */\r
\r
- if (adc2_read(&adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES_16K) == 0) {\r
+ if (adc2_read(&adc16k[FDMDV_OS_TAPS_16K], n_samples_16k) == 0) {\r
GPIOE->ODR = (1 << 3);\r
\r
/* clipping indicator */\r
\r
led_err(0);\r
- for (i=0; i<FREEDV_NSAMPLES_16K; i++) {\r
+ for (i=0; i<n_samples_16k; i++) {\r
if (abs(adc16k[FDMDV_OS_TAPS_16K+i]) > 28000)\r
led_err(1);\r
}\r
\r
- fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES);\r
+ fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], n_samples);\r
\r
if (ss.mode == ANALOG) {\r
- for(i=0; i<FREEDV_NSAMPLES; i++)\r
+ for(i=0; i<n_samples; i++)\r
dac8k[FDMDV_OS_TAPS_8K+i] = adc8k[i];\r
- fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], FREEDV_NSAMPLES); \r
- dac1_write(dac16k, FREEDV_NSAMPLES_16K);\r
+ fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], n_samples); \r
+ dac1_write(dac16k, n_samples_16k);\r
}\r
if (ss.mode == DV) {\r
freedv_tx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k);\r
- for(i=0; i<FREEDV_NSAMPLES; i++)\r
+ for(i=0; i<n_samples; i++)\r
dac8k[FDMDV_OS_TAPS_8K+i] *= 0.398; /* 8dB back off from peak */\r
- fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], FREEDV_NSAMPLES); \r
- dac1_write(dac16k, FREEDV_NSAMPLES_16K);\r
+ fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], n_samples); \r
+ dac1_write(dac16k, n_samples_16k);\r
}\r
if (ss.mode == TONE) {\r
short buf[SINE_SAMPLES];\r
- for(i=0; i<FREEDV_NSAMPLES; i++)\r
+ for(i=0; i<n_samples; i++)\r
buf[i] = aSine[i]*0.398; /* 8dB back off from peak */ \r
while(dac1_write(buf, SINE_SAMPLES) == 0);\r
}\r
\r
if (ss.mode == ANALOG) {\r
\r
- /* force analog bypass when select down */\r
-\r
- if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES_16K) == 0) {\r
- fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES);\r
- for(i=0; i<FREEDV_NSAMPLES; i++)\r
+ if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], n_samples_16k) == 0) {\r
+ fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], n_samples);\r
+ for(i=0; i<n_samples; i++)\r
dac8k[FDMDV_OS_TAPS_8K+i] = adc8k[i];\r
- fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], FREEDV_NSAMPLES); \r
- dac2_write(dac16k, FREEDV_NSAMPLES_16K);\r
+ fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], n_samples); \r
+ dac2_write(dac16k, n_samples_16k);\r
led_rt(0); led_err(0);\r
}\r
}\r
\r
nin = freedv_nin(f); \r
nout = nin;\r
- f->total_bit_errors = 0;\r
+ freedv_zero_total_bit_errors(f);\r
\r
if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], 2*nin) == 0) {\r
GPIOE->ODR = (1 << 3);\r
nout = freedv_rx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k);\r
fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], nout); \r
dac2_write(dac16k, 2*nout);\r
- led_rt(f->fdmdv_stats.sync); led_err(f->total_bit_errors);\r
+ led_rt(freedv_get_sync(f)); led_err(freedv_get_total_bit_errors(f));\r
GPIOE->ODR &= ~(1 << 3);\r
}\r
}\r