def demodulate(self, data, tone_bin, tone_num_samples, tone_phase, fft_bin, nchan, seq_nos=None): phi0 = tone_phase nfft = self.nfft ns = tone_num_samples offset_frequency = tone_offset_frequency(tone_bin, tone_num_samples, fft_bin, nfft) wc = self.compute_pfb_response(offset_frequency) t = np.arange(data.shape[0]) demod = wc * np.exp(-1j * (2 * np.pi * offset_frequency * t + phi0)) * data if type(seq_nos) is np.ndarray: pphase = np.exp(1j * packet_phase(seq_nos[0], offset_frequency, nchan, ns / nfft, nfft)) demod *= pphase if self.hardware_delay_samples != 0: demod *= np.exp(2j * np.pi * self.hardware_delay_samples * tone_bin / tone_num_samples) return demod
def __init__(self, tone_bins, phases, tone_nsamp, fft_bins, nfft=2 ** 14, num_taps=2, window=scipy.signal.flattop, interpolation_factor=64, hardware_delay_samples=0, reference_sequence_number=0): super(StreamDemodulator, self).__init__(nfft=nfft, num_taps=num_taps, window=window, interpolation_factor=interpolation_factor, hardware_delay_samples=hardware_delay_samples) self.tone_bins = tone_bins self.num_channels = self.tone_bins.shape[0] self.tone_nsamp = tone_nsamp self.phases = phases self.fft_bins = fft_bins self.reference_sequence_number = reference_sequence_number self.samples_per_packet = 1024 self.samples_per_channel_per_packet = self.samples_per_packet // self.num_channels self.sequence_number_increment_per_packet = self.samples_per_channel_per_packet * nfft // 2 # The 2 here is # because the sequence number increments once per fpga clock and there are nfft // 2 fpga clocks per sample self.offset_frequencies = tone_offset_frequency(self.tone_bins, self.tone_nsamp, self.fft_bins, self.nfft) self.max_period = get_offset_frequencies_period(self.offset_frequencies) self.pfb_response_correction = self.compute_pfb_response(self.offset_frequencies) self.demodulation_lookup = self.create_demodulation_lookup()
def __init__(self, tone_bins, phases, tone_nsamp, fft_bins, nfft=2**14, num_taps=2, window=scipy.signal.flattop, interpolation_factor=64, hardware_delay_samples=0, reference_sequence_number=0): super(StreamDemodulator, self).__init__(nfft=nfft, num_taps=num_taps, window=window, interpolation_factor=interpolation_factor, hardware_delay_samples=hardware_delay_samples) self.tone_bins = tone_bins self.num_channels = self.tone_bins.shape[0] self.tone_nsamp = tone_nsamp self.phases = phases self.fft_bins = fft_bins self.reference_sequence_number = reference_sequence_number self.samples_per_packet = 1024 self.samples_per_channel_per_packet = self.samples_per_packet // self.num_channels self.sequence_number_increment_per_packet = self.samples_per_channel_per_packet * nfft // 2 # The 2 here is # because the sequence number increments once per fpga clock and there are nfft // 2 fpga clocks per sample self.offset_frequencies = tone_offset_frequency( self.tone_bins, self.tone_nsamp, self.fft_bins, self.nfft) self.max_period = get_offset_frequencies_period( self.offset_frequencies) self.pfb_response_correction = self.compute_pfb_response( self.offset_frequencies) self.demodulation_lookup = self.create_demodulation_lookup()