getting sensible plots from SFDR tests
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 28 Aug 2015 04:14:43 +0000 (04:14 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 28 Aug 2015 04:14:43 +0000 (04:14 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2290 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/adc_sfdr_ut.m [new file with mode: 0644]
codec2-dev/stm32/Makefile
codec2-dev/stm32/src/adc_sfdr_ut.c

diff --git a/codec2-dev/octave/adc_sfdr_ut.m b/codec2-dev/octave/adc_sfdr_ut.m
new file mode 100644 (file)
index 0000000..c2363ed
--- /dev/null
@@ -0,0 +1,28 @@
+% adc_sfdr_ut.m
+% David Rowe Aug 2015
+%
+% Processes data collected from STM32F4 or SFDR testing of ADC
+
+s = load_raw("~/stlink/adc.raw");
+Fs = 2E6;
+N = 1024;
+num_frames = length(s)/N;
+h = hanning(N);
+XdB = zeros(N/2,1);
+
+for i=1:num_frames
+  x = s((i-1)*N+1:i*N);
+  X = fft(x .* h);
+  XdB += 20*log10(abs(X(1:N/2)));
+end
+
+XdB /= num_frames;
+XdB -= max(XdB);
+
+figure(1)
+plot((0:N/2-1)*Fs/(1000*N), XdB)
+grid
+ylabel('Amplitude dB')
+xlabel('Frequency (kHz)');
+axis([0 Fs/(2*1000) -80 0])
+
index 185cf41270901cb6aad36e623a646b0bed03015e..ba9ceeb1e9acbdf57e3f9175065734ea5537e749 100644 (file)
@@ -396,6 +396,7 @@ ADC_SFDR_UT_SRCS=\
 src/adc_sfdr_ut.c \
 gdb_stdio.c \
 ../src/fifo.c \
+src/iir_tuner.c \
 src/sm1000_leds_switches.c \
 src/debugblinky.c \
 src/system_stm32f4xx.c \
@@ -408,7 +409,7 @@ src/init.c \
 src/stm32f4_adc_tuner.o: src/stm32f4_adc_tuner.c
        $(CC) $(CFLAGS) $^ -c -o $@ 
 
-adc_sfdr_ut.elf: $(TUNER_UT_SRCS) src/stm32f4_adc_tuner.o
+adc_sfdr_ut.elf: $(ADC_SFDR_UT_SRCS) src/stm32f4_adc_tuner.o
        $(CC) $(CFLAGS) -O3 $^ -o $@ $(LIBPATHS) $(LIBS)
        $(OBJCOPY) -O binary adc_sfdr_ut.elf adc_sfdr_ut.bin
 
index c8c8cdf343e4b9d98ece1b30cf9293d9a033598e..2b3a1165a9ea8cdc5acd4537c0626a0d4b388cc5 100644 (file)
 #include "../src/codec2_fm.h"\r
 #include "stm32f4xx.h"\r
 \r
-#define REC_TIME_SECS 1\r
+#define BUFS          10\r
 #define FS            2E6\r
-#define N             (ADC_TUNER_BUF_SZ/2)\r
+#define N             1024\r
 \r
 extern int adc_overflow1;\r
 \r
 int main(void) {\r
-    short  buf[N];\r
-    int    bufs, i;\r
-    FILE  *fadc;\r
-\r
-    ftuner = fopen("adc.raw", "wb");\r
-    if (ftuner == NULL) {\r
+    unsigned short unsigned_buf[N];\r
+    short          buf[N];\r
+    int            sam;\r
+    int            i, j, fifo_sz;\r
+    FILE          *fadc;\r
+\r
+    fadc = fopen("adc.raw", "wb");\r
+    if (fadc == NULL) {\r
         printf("Error opening output file: adc.raw\n\nTerminating....\n");\r
         exit(1);\r
     }\r
-    bufs = FS*REC_TIME_SECS/N;\r
-    fifo_sz = ADC_TUNER_N;\r
-    printf("Starting! bufs: %d %d\n", bufs, fifo_sz);\r
+    fifo_sz = ADC_TUNER_BUF_SZ;\r
+    printf("Starting! bufs: %d %d\n", BUFS, fifo_sz);\r
  \r
     adc_open(fifo_sz);\r
     adc_set_tuner_en(0); /* dump raw samples, no tuner */\r
 \r
     sm1000_leds_switches_init();\r
 \r
-    for (i=0; i<bufs; i++) {\r
-        while(adc1_read(buf, N) == -1);\r
+    for (i=0; i<BUFS; i++) {\r
+        while(adc1_read((short*)unsigned_buf, N) == -1);\r
+\r
+        /* convert to signed */\r
+\r
+        for(j=0; j<N; j++) {\r
+            sam = (int)unsigned_buf[j] - 32768;\r
+            buf[j] = sam;\r
+        }\r
 \r
         /* most of the time will be spent here */\r
 \r
@@ -77,6 +85,6 @@ int main(void) {
     }\r
     fclose(fadc);\r
 \r
-    printf("Finsihed!\n");\r
+    printf("Finished!\n");\r
 }\r
 \r