diff --git a/libraries/dsp/correlator/tb/python/verify_correlator.py b/libraries/dsp/correlator/tb/python/verify_correlator.py index ec0941dfb9604fe6cdcea8593cd6d5af98f3dc55..c5bb8884347f36d1cd4d193302d77ec9707367f6 100644 --- a/libraries/dsp/correlator/tb/python/verify_correlator.py +++ b/libraries/dsp/correlator/tb/python/verify_correlator.py @@ -98,19 +98,36 @@ def complex_to_int(input_lists): re = int(round(input_lists[input_nr][word].real)) im = int(round(input_lists[input_nr][word].imag)) print 'Input', input_nr, 'Channel', word, 're,im', re, im - re_bits = CommonBits(re, COMPLEX_WIDTH) - im_bits = CommonBits(im, COMPLEX_WIDTH) + output_list.append(complex(re,im)) + + output_lists.append(output_list) + + return output_lists #correlator_snk_in_arr + + +def concat_complex(input_lists): + """ + Concatenate im&re into one integer + """ + output_lists = [] + for input_nr in range(NOF_INPUTS): + output_list = [] + for word in range(NOF_CHANNELS): + re_bits = CommonBits(int(input_lists[input_nr][word].real), COMPLEX_WIDTH) + im_bits = CommonBits(int(input_lists[input_nr][word].imag), COMPLEX_WIDTH) concat_bits = im_bits & re_bits output_list.append(concat_bits.data) output_lists.append(output_list) - return output_lists #correlator_snk_in_arr + return output_lists def gen_correlator_snk_in_arr_hex(input_lists): """ bla """ + concat_input_lists = concat_complex(input_lists) + # ========================================================== # Interleave the lists if user wants folded correlator input # . Note: no support for more than 1 fold yet. @@ -118,9 +135,9 @@ def gen_correlator_snk_in_arr_hex(input_lists): if NOF_FOLDS==1: input_stream_lists = [] for input_stream_nr in range(NOF_INPUT_STREAMS): - input_stream_lists.append( interleave([input_lists[2*input_stream_nr], input_lists[2*input_stream_nr+1]] ) ) + input_stream_lists.append( interleave([concat_input_lists[2*input_stream_nr], concat_input_lists[2*input_stream_nr+1]] ) ) elif NOF_FOLDS==0: - input_stream_lists = input_lists + input_stream_lists = concat_input_lists # ==================== # Write the HEX files @@ -146,6 +163,7 @@ def correlate(input_lists, accumulation_factor): """ # First transpose the lists into nof_channels*nof_inputs inputs_per_channel = transpose(input_lists) + # Feed each channel to the correlation function vis_per_channel = [] for inputs in inputs_per_channel: @@ -279,7 +297,7 @@ correlator_snk_in_arr_int = complex_to_int(correlator_snk_in_arr_complex) gen_correlator_snk_in_arr_hex(correlator_snk_in_arr_int) # Calculate correlator output from input lists -correlator_src_out_arr_ref = correlate(correlator_snk_in_arr_complex, INTEGRATION_PERIOD) +correlator_src_out_arr_ref = correlate(correlator_snk_in_arr_int, INTEGRATION_PERIOD) @@ -289,12 +307,49 @@ correlator_src_out_arr_ref = correlate(correlator_snk_in_arr_complex, INTEGRATIO # Read test bench output file written by dp_stream_rec_play.vhd correlator_src_out_arr = rec_file_to_complex(REC_FILE, complex_width=CORRELATOR_OUTPUT_COMPLEX_WIDTH) +def nozero(input_nr): + """ + Returns a/b when b is non-zero. Otherwise returns almost zero. + """ + if not(input_nr==0): + return input_nr + else: + return 0.00000000000000000000000000000000000001 +import sys +def compare_correlator_src_out_arr(vhdl_out, model_out, max_deviation_factor): + """ + Compare the VHDL correlator's output to the Python model output. + . A max_deviation_factor (0..1) is allowed in both the real and the imaginary + values -> 1% max = 0.01 + . A too great deviation results in a False being returned. + """ + passed = True + channel_nr = 0 + for vhdl_channel,model_channel in zip(vhdl_out, model_out): + vis_nr = 0 + for vhdl_visibility,model_visibility in zip(vhdl_channel, model_channel): + diff_re = abs(model_visibility.real-vhdl_visibility.real) / nozero(abs(model_visibility.real)) + diff_im = abs(model_visibility.imag-vhdl_visibility.imag) / nozero(abs(model_visibility.imag)) + + if diff_re>max_deviation_factor or diff_im>max_deviation_factor: + print 'compare_correlator_src_out_arr: FAILED' + print '. channel', channel_nr, 'visibility', vis_nr + print ' . diff_re', diff_re + print ' . model_visibility.real', model_visibility.real + print ' . vhdl_visibility.real', vhdl_visibility.real + print ' . diff_im', diff_im + print ' . model_visibility.imag', model_visibility.imag + print ' . vhdl_visibility.imag', vhdl_visibility.imag + + sys.exit() + vis_nr+=1 + channel_nr+=1 print 'corr out', correlator_src_out_arr[0] print 'corr ref', correlator_src_out_arr_ref[0] - +compare_correlator_src_out_arr(correlator_src_out_arr, correlator_src_out_arr_ref, 0.001) def plot_phase_shifts(correlator_output): """