You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
4.2 KiB
119 lines
4.2 KiB
#!/usr/bin/env python |
|
# -*- coding: utf-8 -*- |
|
# |
|
# Copyright 2016 <+YOU OR YOUR COMPANY+>. |
|
# |
|
# This is free software; you can redistribute it and/or modify |
|
# it under the terms of the GNU General Public License as published by |
|
# the Free Software Foundation; either version 3, or (at your option) |
|
# any later version. |
|
# |
|
# This software is distributed in the hope that it will be useful, |
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
# GNU General Public License for more details. |
|
# |
|
# You should have received a copy of the GNU General Public License |
|
# along with this software; see the file COPYING. If not, write to |
|
# the Free Software Foundation, Inc., 51 Franklin Street, |
|
# Boston, MA 02110-1301, USA. |
|
# |
|
|
|
import numpy as np |
|
from gnuradio import gr |
|
import code |
|
|
|
class max_freq(gr.sync_block): |
|
""" |
|
docstring for block max_freq |
|
""" |
|
def __init__(self, fft_len=1024,num_decoders=4,center_freq=0,samp_rate=0): |
|
gr.sync_block.__init__(self, |
|
name="max_freq", |
|
in_sig=[(np.float32,fft_len)], |
|
out_sig=None) |
|
self.fft_len=fft_len |
|
self.num_decoders=num_decoders |
|
self.center_freq=center_freq |
|
self.samp_rate=samp_rate |
|
self.num_averages=5 |
|
self.avg_counter=-1 |
|
self.numbers_avg=[] |
|
|
|
|
|
def work(self, input_items, output_items): |
|
#in0 = input_items[0] |
|
#ii=input_items |
|
numbers=abs(input_items[0][0]) |
|
threshold=6 |
|
if self.avg_counter == -1: #init |
|
self.numbers_avg=numbers |
|
self.avg_counter=0 |
|
elif self.avg_counter <= self.num_averages: |
|
#np.mean( np.array([ old_set, new_set ]), axis=0 ) |
|
self.numbers_avg=np.mean( np.array([ self.numbers_avg, numbers ]), axis=0 ) |
|
self.avg_counter+=1 |
|
elif len(np.where(self.numbers_avg>threshold)[0]) >0: |
|
self.avg_counter=0 |
|
numbers=self.numbers_avg |
|
min_consec_max_threshold=4#minimum number of consecutive maximums (in fft domain) to consider signal as station |
|
#TODO: what if no numbers over threshold? |
|
#TODO auto threshold |
|
#max_indices=[[421, 428, 429, 430, 431, 432, 433, 434, 436, 437, 438, 831, 832, 837, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851,852, 853, 854, 855, 856, 857]] |
|
max_indices=np.where(numbers>threshold) |
|
station_indices=[] |
|
|
|
last_index=max_indices[0][0] |
|
#last_index=0 |
|
count=1#counts number of consecutive maximums |
|
threshold_reached=False |
|
fuzzyness=10 |
|
# max_indices[0].append(0)#to detect last station |
|
max_indices=np.append(max_indices,0)#to detect last station |
|
for i in max_indices: |
|
if abs(i-last_index) <= fuzzyness: |
|
count+=i-last_index |
|
else:#last streak ended |
|
if(threshold_reached): |
|
station_indices.append(last_index-int(count/2))#use center of max-streak |
|
threshold_reached=False |
|
count=1 |
|
else:#last streak didn't reach threshold -> no station |
|
count=1 |
|
if count==min_consec_max_threshold: |
|
threshold_reached=True |
|
last_index=i |
|
|
|
station_freqs=[] |
|
#index to freq: |
|
for index in station_indices: |
|
startfreq=self.center_freq-self.samp_rate/2 |
|
freq=self.samp_rate*index/self.fft_len+startfreq |
|
station_freqs.append(freq) |
|
|
|
""" |
|
[422 423 426 427 428 430 431 432 433 434 435 436 437 836 837 838 842 843 |
|
844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 861 862 |
|
0] |
|
[] |
|
[] |
|
[423 424 425 426 427 428 429 430 431 432 433 434 842 843 844 845 848 849 |
|
850 851 852 853 854 855 858 859 860 0] |
|
[428, 851] |
|
[101303125.0, 102294531.0] |
|
[415 416 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 |
|
844 845 846 847 848 849 850 851 852 853 854 855 856 861 862 863 0] |
|
[853] |
|
[102299218.0] |
|
""" |
|
#f=open("/tmp/obj","r") |
|
#import pickle |
|
#pickle.load(ii,f) |
|
#(array([431, 433, 437, 439, 849, 854, 856, 858, 861, 862]),) |
|
#code.interact(local=locals()) |
|
# <+signal processing here+> |
|
print(max_indices) |
|
print(station_indices) |
|
print(station_freqs) |
|
return len(input_items[0]) |
|
|
|
|