along with this program; if not, see <http://www.gnu.org/licenses/>.\r
*/\r
\r
+#define PROFILE\r
+\r
+#include <assert.h>\r
#include <stdio.h>\r
#include <stdlib.h>\r
#include <stdint.h>\r
#include "gdb_stdio.h"\r
#include "freedv_api.h"\r
#include "machdep.h"\r
+#include "codec2_fdmdv.h"\r
\r
#ifdef __EMBEDDED__\r
#define printf gdb_stdio_printf\r
#define fclose gdb_stdio_fclose\r
#define fread gdb_stdio_fread\r
#define fwrite gdb_stdio_fwrite\r
+#define fprintf gdb_stdio_fprintf\r
#endif\r
\r
+#define FREEDV_NSAMPLES_16K (2*FREEDV_NSAMPLES)\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, nin, nout = 0;\r
- PROFILE_VAR(freedv_start);\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
+ 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
\r
- // Transmit ---------------------------------------------------------------------\r
+ // Receive ---------------------------------------------------------------------\r
\r
frame = 0;\r
\r
- fin = fopen("mod.raw", "rb");\r
+ fin = fopen("mod_16k.raw", "rb");\r
if (fin == NULL) {\r
printf("Error opening input file\n");\r
exit(1);\r
}\r
\r
- fout = fopen("stm_out.raw", "wb");\r
+ fout = fopen("speechout_16k.raw", "wb");\r
if (fout == NULL) {\r
printf("Error opening output file\n");\r
exit(1);\r
}\r
\r
+ ftotal = fopen("total.txt", "wt");\r
+ assert(ftotal != NULL);\r
+\r
+ /* clear filter memories */\r
+\r
+ for(i=0; i<FDMDV_OS_TAPS_16K; i++)\r
+ adc16k[i] = 0.0;\r
+ for(i=0; i<FDMDV_OS_TAPS_8K; i++)\r
+ dac8k[i] = 0.0;\r
+ \r
nin = freedv_nin(f);\r
- while (fread(inbuf, sizeof(short), nin, fin) == nin) {\r
- PROFILE_SAMPLE(freedv_start);\r
- nout = freedv_rx(f, outbuf, inbuf);\r
- nin = freedv_nin(f);\r
- PROFILE_SAMPLE_AND_LOG2(freedv_start, " demod"); \r
+ nin_16k = 2*nin;\r
+ nout = nin;\r
+ while (fread(&adc16k[FDMDV_OS_TAPS_16K], sizeof(short), nin_16k, fin) == nin_16k) {\r
+\r
+ PROFILE_SAMPLE(fdmdv_16_to_8_start);\r
+\r
+ fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], nin);\r
\r
+ PROFILE_SAMPLE_AND_LOG(freedv_rx_start, fdmdv_16_to_8_start, " fdmdv_16_to_8");\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
+ fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], nout); \r
+\r
+ PROFILE_SAMPLE_AND_LOG2(fdmdv_8_to_16_start, " fdmdv_8_to_16");\r
+\r
+ fprintf(ftotal, "%d\n", machdep_profile_sample() - fdmdv_16_to_8_start);\r
machdep_profile_print_logged_samples();\r
- fwrite(outbuf, sizeof(short), nout, fout);\r
- printf("frame: %d\n", ++frame);\r
+\r
+ fwrite(dac16k, sizeof(short), 2*nout, fout);\r
+ fdmdv_get_demod_stats(f->fdmdv, &stats);\r
+ printf("frame: %d nin_16k: %d sync: %d SNR: %3.2f \n", \r
+ ++frame, nin_16k, stats.sync, (double)stats.snr_est);\r
}\r
\r
fclose(fin);\r
fclose(fout);\r
+ fclose(ftotal);\r
\r
return 0;\r
}\r
\r
int main(void) {\r
struct freedv *f;\r
- float adc16k[FDMDV_OS_TAPS_16K+FREEDV_NSAMPLES_16K];\r
- float adc8k[FREEDV_NSAMPLES];\r
- float dac8k[FDMDV_OS_TAPS_8K+FREEDV_NSAMPLES];\r
- float dac16k[FREEDV_NSAMPLES_16K];\r
- short buf[FREEDV_NSAMPLES_16K];\r
-\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
+ \r
int nin, nout, i;\r
\r
/* init all the drivers for various peripherals */\r
//sm1000_leds_switches_init();\r
dac_open(4*DAC_BUF_SZ);\r
adc_open(4*ADC_BUF_SZ);\r
- //f = freedv_open(FREEDV_MODE_1600);\r
+ f = freedv_open(FREEDV_MODE_1600);\r
\r
/* LEDs into a known state */\r
\r
dac8k[i] = 0.0;\r
\r
while(1) {\r
- if(1) {\r
+\r
+\r
+ if (0) {\r
\r
/* Transmit -------------------------------------------------------------------------*/\r
\r
/* ADC2 is the SM1000 microphone, DAC1 is the modulator signal we send to radio tx */\r
\r
- if (adc1_read(buf, FREEDV_NSAMPLES_16K) == 0) {\r
-\r
+ if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES_16K) == 0) {\r
GPIOE->ODR = (1 << 3);\r
- for(i=0; i<FREEDV_NSAMPLES_16K; i++)\r
- adc16k[FDMDV_OS_TAPS_16K+i] = buf[i];\r
\r
- fdmdv_16_to_8(adc8k, &adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES);\r
+ fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], FREEDV_NSAMPLES);\r
\r
- for(i=0; i<FREEDV_NSAMPLES; i++)\r
- buf[i] = adc8k[i];\r
- //freedv_tx(f, buf, buf);\r
- for(i=0; i<FREEDV_NSAMPLES; i++)\r
- dac8k[FDMDV_OS_TAPS_8K+i] = adc8k[i];\r
+ freedv_tx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k);\r
+ //for(i=0; i<FREEDV_NSAMPLES; i++)\r
+ // dac8k[FDMDV_OS_TAPS_8K+i] = adc8k[i];\r
\r
- fdmdv_8_to_16(dac16k, &dac8k[FDMDV_OS_TAPS_8K], FREEDV_NSAMPLES); \r
+ fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], FREEDV_NSAMPLES); \r
\r
- for(i=0; i<FREEDV_NSAMPLES_16K; i++)\r
- buf[i] = dac16k[i]; \r
- dac2_write(buf, FREEDV_NSAMPLES_16K);\r
- GPIOE->ODR &= ~(1 << 3);\r
+ dac2_write(dac16k, FREEDV_NSAMPLES_16K);\r
\r
//led_ptt(1); led_rt(0); led_err(0);\r
+ GPIOE->ODR &= ~(1 << 3);\r
}\r
\r
}\r
\r
/* ADC1 is the demod in signal from the radio rx, DAC2 is the SM1000 speaker */\r
\r
- nin = freedv_nin(f);\r
+ nin = freedv_nin(f); \r
+ nout = nin;\r
f->total_bit_errors = 0;\r
- \r
- if (adc1_read(buf, nin) == 0) {\r
- nout = freedv_rx(f, buf, buf);\r
- dac2_write(buf, nout);\r
- led_ptt(0); led_rt(f->fdmdv_stats.sync); led_err(f->total_bit_errors);\r
- nin = freedv_nin(f);\r
+\r
+ if (adc1_read(&adc16k[FDMDV_OS_TAPS_16K], 2*nin) == 0) {\r
+ GPIOE->ODR = (1 << 3);\r
+ fdmdv_16_to_8_short(adc8k, &adc16k[FDMDV_OS_TAPS_16K], nin);\r
+ nout = freedv_rx(f, &dac8k[FDMDV_OS_TAPS_8K], adc8k);\r
+ //for(i=0; i<FREEDV_NSAMPLES; i++)\r
+ // dac8k[FDMDV_OS_TAPS_8K+i] = adc8k[i];\r
+ fdmdv_8_to_16_short(dac16k, &dac8k[FDMDV_OS_TAPS_8K], nout); \r
+ dac2_write(dac16k, 2*nout);\r
+ //led_ptt(0); led_rt(f->fdmdv_stats.sync); led_err(f->total_bit_errors);\r
+ GPIOE->ODR &= ~(1 << 3);\r
}\r
\r
}\r
- \r
+ \r
} /* while(1) ... */\r
}\r
\r