diff options
Diffstat (limited to 'airspy_waterfall.py')
-rw-r--r-- | airspy_waterfall.py | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/airspy_waterfall.py b/airspy_waterfall.py new file mode 100644 index 0000000..255ecd5 --- /dev/null +++ b/airspy_waterfall.py @@ -0,0 +1,153 @@ +import os +import sys +import math + +import airspyhf + +import matplotlib +import numpy +import pylab + +import pygame +from pygame import gfxdraw + +CENTER_FREQ = 4e6 +SAMPLE_RATE = 196e3 +SAMPLE_NUM = 2048 +GAIN = 'auto' + +SCREEN_X = 1025 +SCREEN_Y = 320 + +MOVE_STEP = 0.1e6 + +# init RTLSDR and if no then go out +try: + pass +except IOError: + print + "Probably RTLSDR device not attached" + sys.exit(0) + +# config rtlsdr device +#rtl.sample_rate = SAMPLE_RATE +#rtl.center_freq = CENTER_FREQ +#rtl.gain = GAIN + + +def iq_abs(c): + return (math.sqrt((c.real ** 2 + c.imag ** 2))) + + +# point should be normalised to 0.0 ... 1.0 +def color_normalise(point): + ret = (255, 0, 0) + # blue + if (point < 0.3): + ret = (0, 0, int(point * 255 * 3.3)) + # yello + elif (point < 0.7): + ret = (0, int((point - 0.3) * 255 * 2.5), 0) + # red + elif (point <= 1.0): + ret = (int((point - 0.7) * 255 * 3.3), 0, 0) + else: + # print "Color Error ", point + pass + return ret + + +def color_mapping(x): + "assumes -50 to 0 range, returns color" + r = int((x + 50) * 255 // 50) + r = max(0, r) + r = min(255, r) + return (r, r, 100) + + +# def draw_Hz( surface, x, y, hz ): + + +arr = [[0 for i in range(0, SCREEN_X)] for j in range(0, SCREEN_Y)] + +# init all pygame modules audio,video and more +pygame.init() + +# [NEW] creates screen surface using constants +screen = pygame.display.set_mode((SCREEN_X, SCREEN_Y)) + +#samples = rtl.read_samples(SAMPLE_NUM) +samples = [] + +run = True +line = 0 +while run: + + # print "update" + + # check for all events that where ocure + for event in pygame.event.get(): + # if some one clicked on close button + if event.type == pygame.QUIT: + # terminate programm + run = False + # don't waste your time by waiting while event loop will end + break + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_LEFT: + print + "Left" + rtl.center_freq -= MOVE_STEP + print + "Center freq: ", rtl.center_freq, " Hz" + elif event.key == pygame.K_RIGHT: + print + "Right" + rtl.center_freq += MOVE_STEP + print + "Center freq: ", rtl.center_freq, " Hz" + + width = SCREEN_X + height = SCREEN_Y + + samples = rtl.read_samples(SAMPLE_NUM) + spect = numpy.fft.fft(samples) + spect = spect[0:len(spect) / 2] + + # (1/(Fs*N)) * abs(xdft).^2; + spect_n = [(1.0 / (SAMPLE_NUM * len(spect))) * iq_abs(x) ** 2 for x in spect] + spect_n = (10 * numpy.log10(spect_n)).tolist() + + # total data size + spect_len = len(spect_n) + + # calculate amount spect points per pixel without rounding + pixel_width = spect_len / SCREEN_X + 1 + pixel_steps = spect_len / pixel_width + + for step in range(0, pixel_steps): + avg = 0.0 + for i in range(0, pixel_width): + avg += spect_n[step * pixel_width + i] + avg /= pixel_width + + # print avg + # gfxdraw.pixel( screen, step, line, color_normalise((100-abs(avg))/10)) + gfxdraw.pixel(screen, step, line, color_mapping(avg)) + + # draw central freq + font = pygame.font.Font(None, 20) + text = font.render(str(rtl.center_freq / 1e6), 1, (200, 30, 30), (0, 0, 0)) + screen.blit(text, (SCREEN_X / 2, SCREEN_Y - 20)) + text = font.render(str((rtl.center_freq + SAMPLE_RATE / 2) / 1e6), 1, (200, 30, 30), (0, 0, 0)) + screen.blit(text, (SCREEN_X - 40, SCREEN_Y - 20)) + text = font.render(str((rtl.center_freq - SAMPLE_RATE / 2) / 1e6), 1, (200, 30, 30), (0, 0, 0)) + screen.blit(text, (20, SCREEN_Y - 20)) + + pygame.display.flip() + line += 1 + if (line > SCREEN_Y): + line = 0 + +pygame.quit + |