Browse Source

fft cutting works, 1st prototype with 19MS/s and gui-sliders

master
Clemens Richter 9 years ago
parent
commit
2aa3687ff8
  1. 39
      grc/crfa_vector_cutter.xml
  2. 27
      python/vector_cutter.py

39
grc/crfa_vector_cutter.xml

@ -4,13 +4,42 @@
<key>crfa_vector_cutter</key> <key>crfa_vector_cutter</key>
<category>[crfa]</category> <category>[crfa]</category>
<import>import crfa</import> <import>import crfa</import>
<make>crfa.vector_cutter($insize, $outsize, $cutpoint)</make> <make>crfa.vector_cutter($insize, $outsize, $cutpoint,$pad_out)</make>
<!-- Make one 'param' node for every Parameter you want settable from the GUI. <!-- Make one 'param' node for every Parameter you want settable from the GUI.
Sub-nodes: Sub-nodes:
* name * name
* key (makes the value accessible as $keyname, e.g. in the make node) * key (makes the value accessible as $keyname, e.g. in the make node)
* type --> * type -->
<callback>set_cutpoint($cutpoint);</callback> <callback>set_cutpoint($cutpoint);</callback>
<!-- <param>
<name>padded output</name>
<key>pad_out</key>
<value>False</value>
<type>bool</type>
<option>
<name>Enable</name>
<key>True</key>
</option>
<option>
<name>Disable</name>
<key>False</key>
</option>
</param>-->
<param>
<name>padded output</name>
<key>pad_out</key>
<value>False</value>
<type>enum</type>
<hide>part</hide>
<option>
<name>Yes</name>
<key>True</key>
</option>
<option>
<name>No</name>
<key>False</key>
</option>
</param>
<param> <param>
<name>insize</name> <name>insize</name>
<key>insize</key> <key>insize</key>
@ -41,4 +70,12 @@
<type>complex</type> <type>complex</type>
<vlen>$outsize</vlen> <vlen>$outsize</vlen>
</source> </source>
<source>
<name>out_padded</name>
<type>complex</type>
<vlen>$insize</vlen>
<optional>#if $pad_out() == 'True' then 'False' else 'True'#</optional>
<!--<optional>#if $pad_out==True then '1' else '0'#</optional>-->
<hide>#if $pad_out() == 'True' then 'False' else 'True'#</hide>
</source>
</block> </block>

27
python/vector_cutter.py

@ -27,18 +27,25 @@ class vector_cutter(gr.sync_block):
""" """
docstring for block vector_cutter docstring for block vector_cutter
""" """
def __init__(self, insize=2048,outsize=1024,cutpoint=512): def __init__(self, insize=2048,outsize=1024,cutpoint=512,pad_out=False):
if pad_out:
gr.sync_block.__init__(self,
name="vector_cutter",
in_sig=[(np.complex64,insize)],
out_sig=[(np.complex64,outsize),(np.complex64,insize)])
else:
gr.sync_block.__init__(self, gr.sync_block.__init__(self,
name="vector_cutter", name="vector_cutter",
in_sig=[(np.complex64,insize)], in_sig=[(np.complex64,insize)],
out_sig=[(np.complex64,outsize)]) out_sig=[(np.complex64,outsize)])
self.cutpoint=cutpoint self.cutpoint=cutpoint
self.insize=insize self.insize=insize
self.outsize=outsize self.outsize=outsize
print(pad_out)
self.pad_out=pad_out
def set_cutpoint(self, cutpoint=None): def set_cutpoint(self, cutpoint=None):
print("cutpoint set to %i"%cutpoint) #print("cutpoint set to %i"%cutpoint)
if cutpoint is not None: if cutpoint is not None:
if isinstance(cutpoint, float) or isinstance(cutpoint, int): if isinstance(cutpoint, float) or isinstance(cutpoint, int):
self.cutpoint=cutpoint self.cutpoint=cutpoint
@ -47,10 +54,22 @@ class vector_cutter(gr.sync_block):
def work(self, input_items, output_items): def work(self, input_items, output_items):
in0 = input_items[0] in0 = input_items[0]
out = output_items[0] out = output_items[0]
if self.pad_out:
out_padded = output_items[1]
# <+signal processing here+> # <+signal processing here+>
#out[:] = in0[512:1536] #out[:] = in0[512:1536]
cutpoint=self.cutpoint
attenuation=1e-2#40db (power)
for i,in_vec in enumerate(in0): for i,in_vec in enumerate(in0):
out[i]=in_vec[self.cutpoint:self.cutpoint+self.outsize] if 0<=cutpoint<self.insize-self.outsize:
out[i]=in_vec[cutpoint:cutpoint+self.outsize]
if self.pad_out:
out_padded[i]=in_vec*np.concatenate((attenuation*np.ones(cutpoint),np.ones(self.outsize),attenuation*np.ones(self.insize-self.outsize-cutpoint)))
elif cutpoint <=self.insize:
out[i]=np.append(in_vec[cutpoint:self.insize],in_vec[0:self.outsize-self.insize+cutpoint])
if self.pad_out:
out_padded[i]=in_vec*np.concatenate((np.ones(cutpoint+self.outsize-self.insize),attenuation*np.ones(self.insize-self.outsize),np.ones(self.insize-cutpoint)))
#out[i]=np.append(out_cut[self.outsize/2:self.outsize],out_cut[0:self.outsize/2])
#out = in0[512:1536] #out = in0[512:1536]
#code.interact(local=locals()) #code.interact(local=locals())
#out[0] = in0[0][512:1536] #out[0] = in0[0][512:1536]

Loading…
Cancel
Save