benchmark_rx.py

「benchmark_rx.py」の編集履歴(バックアップ)一覧に戻る

benchmark_rx.py - (2011/12/15 (木) 02:59:45) のソース

*フロー
Source → LPF → dbpsk demodulator → descrambler → access code correlator → Sink

*usrpソースの作成
self.u = usrp_options.create_usrp_source(options)
-self.u.set_decim(self._decim)
options.bitrate, self._demod_class.bits_per_symbol(),
options.samples_per_symbol, options.decim, adc_rate,
から最適なdecimationを決定した後、この関数でそれをセットする。

*LPFの作成
self.channel_filter = gr.fft_filter_ccc(sw_decim, chan_coeffs)
必要な帯域を取得する

*搬送波をセンシングする
self.probe = gr.probe_avg_mag_sqrd_c(thresh,alpha)
-thresh :in dB, will have to adjust
こいつはlpfの次に入っていて、フローグラフからははぶられている。
 
*Demodulator
-multiply_const_cc
 #Automatic gain control
 scale = (1.0/16384.0)
 self.pre_scaler = gr.multiply_const_cc(scale)   # scale the signal from full-range to +-1
受信信号を+1から-1の範囲で正規化
-gr.feedforward_agc_cc        
 #self.agc = gr.agc2_cc(0.6e-1, 1e-3, 1, 1, 100)
 self.agc = gr.feedforward_agc_cc(16, 2.0)
-gr.interp_fir_filter_ccf
 # RRC data filter
 ntaps = 11 * samples_per_symbol
 self.rrc_taps = gr.firdes.root_raised_cosine(
            1.0,                      # gain
            self._samples_per_symbol, # sampling rate
            1.0,                      # symbol rate
            self._excess_bw,          # excess bandwidth (roll-off factor)
            ntaps)
 self.rrc_filter=gr.interp_fir_filter_ccf(1, self.rrc_taps)        
波形整フィルタ
-gr.mpsk_receiver_cc
 # symbol clock recovery
 if not self._mm_gain_mu:
 self._mm_gain_mu = 0.1
            
 self._mm_omega = self._samples_per_symbol
 self._mm_gain_omega = .25 * self._mm_gain_mu * self._mm_gain_mu
 self._costas_beta  = 0.25 * self._costas_alpha * self._costas_alpha
 fmin = -0.1
 fmax = 0.1
        
 self.receiver=gr.mpsk_receiver_cc(arity, 0,
                                   self._costas_alpha, self._costas_beta,
                                   fmin, fmax,
                                   self._mm_mu, self._mm_gain_mu,
                                   self._mm_omega, self._mm_gain_omega,
                                   self._mm_omega_relative_limit)
-[[gr.diff_phasor_cc>http://www35.atwiki.jp/space_escalator/pages/76.html]]
 # Do differential decoding based on phase change of symbols
 self.diffdec = gr.diff_phasor_cc()
差分位相偏移変調
-[[gr.constellation_decoder_cb>http://www35.atwiki.jp/space_escalator/pages/84.html]]
 # find closest constellation point
 rot = 1
 rotated_const = map(lambda pt: pt * rot, psk.constellation[arity])
 self.slicer = gr.constellation_decoder_cb(rotated_const, range(arity))
スライサー:ある入力信号において、ユークリッド距離が一番近いコンステレーションポイントが選ばれる。
bpskの場合は1or-1に近い方からそれぞれ1,0が選ばれる。
-gr.map_bb
 if self._gray_code:
     self.symbol_mapper = gr.map_bb(psk.gray_to_binary[arity])
 else:
     self.symbol_mapper = gr.map_bb(psk.ungray_to_binary[arity])
-gr.unpack_k_bits_bb
 # unpack the k bit vector into a stream of bits
 self.unpack = gr.unpack_k_bits_bb(self.bits_per_symbol())
送信されたビット列をバイト列にまとめる。

*相関器
self.correlator = gr.correlate_access_code_bb(access_code, threshold)
@param access_code: AKA sync vector
@type access_code: string of 1's and 0's
@param threshold: detect access_code with up to threshold bits wrong (-1 -> use default) #間違っていいビット数
@type threshold: int
gr.correlate_access_code_bb.h
 *!
 * \brief Examine input for specified access code, one bit at a time.
 * \ingroup sync_blk
 *
 * input:  stream of bits, 1 bit per input byte (data in LSB)
 * output: stream of bits, 2 bits per output byte (data in LSB, flag in next higher bit)
 *
 * Each output byte contains two valid bits, the data bit, and the
 * flag bit.  The LSB (bit 0) is the data bit, and is the original
 * input data, delayed 64 bits.  Bit 1 is the
 * flag bit and is 1 if the corresponding data bit is the first data
 * bit following the access code. Otherwise the flag bit is 0.
 */

*シンクの作成
self.framer_sink = gr.framer_sink_1(self._rcvd_pktq)
----