def demodulate(self, samples): if self.demodtype == "envelop": return self.avgfilter(numpy.abs(samples), (self.samplerate / self.fc) / 2) elif self.demodtype == "avg": het_samples = samples * common.local_carrier(self.fc, len(samples), self.samplerate) # return self.avgfilter(het_samples, SAMPLES_PER_CARRIER/2) return self.avgfilter(het_samples, (self.samplerate / self.fc) / 2) elif self.demodtype == "quad": """ A quadrature demodulator. """ het_samples = samples * common.local_carrier(self.fc, len(samples), self.samplerate, "demodquad") # self.plot_sig_spectrum(numpy.real(het_samples),"demodulated samples before LPF - I-branch") # set the LPF cut-off frequency omega_lo = 1.5 * math.pi / self.mapper.spb omega_hi = self.fc * 2 * math.pi / self.samplerate omega_cut = (self.changap * 2 * math.pi / self.samplerate) / 2.0 print "Rx LPF Cutoff frequency :", omega_cut demod_filt_out = self.lpfilter(het_samples, omega_cut, "receive LPF") samples_rx_out = numpy.abs(demod_filt_out) # self.plot_sig_spectrum(numpy.real(demod_filt_out), # "demodulated samples after LPF - I-branch") # p.show() return samples_rx_out else: print "Unsupported demod type" sys.exit(1)
def modulate(self, samples): ''' Multiply samples by a local sinusoid carrier of the same length. Return the multiplied result. ''' print '\tNumber of samples being sent:', len(samples) return samples * local_carrier(self.fc, len(samples), self.samplerate)
def detect_energy(self, samples): zerolen = self.preamble.silence * self.mapper.spb isamp = samples[:zerolen] mod_isamp = isamp * common.local_carrier(self.fc, len(isamp), self.samplerate) noise_mean = numpy.mean(mod_isamp) noise_std = numpy.std(mod_isamp) for offset in xrange(len(samples)): if abs(samples[offset] > noise_mean + 5.0 * noise_std): break return offset
def detect_preamble(self, samples): """ Preamble detection modulating over carrier (ie, not in baseband). """ offset = max(0, self.detect_energy(samples)) print "Some sort of energy detected around sample", offset barker = self.preamble.barker() presamples = self.mapper.bits2samples(barker) mod_presamples = presamples * common.local_carrier(self.fc, len(presamples), self.samplerate) x = 2 * self.preamble.barkerlen() * self.mapper.spb return max(0, self.correlate(mod_presamples, samples[max(0, offset - x) : offset + x]))
def modulate(self, samples): ''' Multiply samples by a local sinusoid carrier of the same length. Return the multiplied result. ''' return samples * local_carrier(self.fc, len(samples), self.samplerate)