cleaning up and putting much better code in. Step 1 of 2
[debian/gnuradio] / gr-msdd6000 / src / python_test / spectrogram.py
1 #!/usr/bin/python
2
3 fft_bins = 1024;
4 stride = 256;
5
6 #filename = "output.dat";
7 #decim = 4;
8 #Fs = (102.4/decim) * 1e6;
9
10
11 from gnuradio import gr;
12 from Numeric import *;
13 import FFT;
14 import numpy.fft;
15 from numpy import *;
16 from pylab import *;
17 import sys;
18
19 if len(sys.argv) <2: 
20         print "usage:  %s filename <sample_rate_in_MSPS> <stride_samples>"%(sys.argv[0]);
21         sys.exit(-1);
22
23 filename = sys.argv[1];
24 fs = 0;
25 if(len(sys.argv)>2):
26         fs = float(sys.argv[2])*1000000;
27 print "opening %s.\n"%(filename);
28
29 if(len(sys.argv)>=4):
30         stride = int(sys.argv[3]);
31         print "using stride = %d"%(stride);
32
33 tb = gr.top_block();
34 src = gr.file_source(gr.sizeof_gr_complex, filename, False)
35 sink = gr.vector_sink_c();
36 tb.connect(src,sink);
37 tb.run();
38
39 data = sink.data();
40 dataa = array(data);
41 datalen = len( data );
42
43 time_bins = (datalen - fft_bins) / stride;
44
45 print "output vector :: fft_bins = %d, time_bins = %d\n"%(fft_bins,time_bins);
46
47 start_idx = 0;
48
49 b = numpy.zeros((time_bins, fft_bins), complex);
50 l = [];
51
52 window = numpy.blackman(fft_bins);
53
54 for i in range(0,time_bins):
55         
56         time_chunk = take( dataa, range(start_idx,start_idx + fft_bins), 0);
57         time_chunk = time_chunk * window;
58         fft_chunk = numpy.fft.fftshift(numpy.fft.fft(time_chunk));
59         psd = 10*log10(fft_chunk * conj(fft_chunk)+0.001);
60
61         b[i] = psd.real;
62         l.append( psd.real.tolist() );
63
64         start_idx = start_idx + stride;
65
66 #c = array(b, 10);
67
68 print b[0];
69 c = array(b);
70 #l = c.tolist();
71 print size(l);
72
73 x = range(0,time_bins);
74 print size(x);
75 y = range(0,fft_bins);
76 print size(y);
77
78 print size(l);
79
80 contourf(l);
81 #contourf([x,y], l);
82 colorbar();
83 show();
84
85 #print c[1,1];
86
87