예제 #1
0
class FrequencyStream(object):

    """Frequency stream."""

    def __init__(self):
        """Construct FrequencyStream object."""
        self.mic = Mic('Blue Snowball')

    def __enter__(self):
        """Open and return frequency stream."""
        self.mic.open()
        return self

    def __exit__(self, type, value, traceback):
        """Close stream."""
        self.mic.close()

    def fft(self, data, jump):
        """Return data in frequency domain."""
        # cut up data
        # start frame
        start = 0
        # go until interval reaches final frame
        while start + 8192 <= len(data):
            # get fft of interval
            freq = np.absolute(np.fft.rfft(data[start:start+8192]))
            # send out fft
            yield freq
            # move to next interval
            start += jump

    def read(self, jump=1024, frames=None):
        """Read a number of frames of data into the stream."""
        # read all frames
        self.mic.read(frames)
        # iterate through buffers
        for buff in self.fft(self.mic.stream.channel_1, jump):
            yield buff
예제 #2
0
class App():
	def __init__(self):
		self.mic     = Mic()
		self.speaker = Speaker()
		self.client  = Client()
		self.modem   = Modem()

		self.selectedMod = 'AM'

		self.modulations = {
			'AM': self.modem.modAm,
			'AMSC': self.modem.modAmsc,
			'FM': self.modem.modFm
		}

		self.demodulations = {
			'AM': self.modem.demodAm,
			'AMSC': self.modem.demodAmsc,
			'FM': self.modem.demodFm
		}

		self.fig, self.axes = plt.subplots(4, 1, figsize=[6,8])
		plt.subplots_adjust(top=0.7)
		for i in range(4):
			self.axes[i].axes.xaxis.set_visible(False)
			self.axes[i].axes.yaxis.set_visible(False)

		self.input_ip       = TextBox(plt.axes([0.1,  0.05, 0.4, 0.05]), '', initial='192.168.0.20')
		self.btn_connect    =  Button(plt.axes([0.5,  0.05, 0.2, 0.05]), 'Connect')
		self.btn_disconnect =  Button(plt.axes([0.7,  0.05, 0.2, 0.05]), 'Disconnect')

		self.btn_am   =  Button(plt.axes([0.1,  0.94, 0.2, 0.05]), 'AM')
		self.btn_amsc =  Button(plt.axes([0.3,  0.94, 0.2, 0.05]), 'AMSC')
		self.btn_fm   =  Button(plt.axes([0.5,  0.94, 0.2, 0.05]), 'FM')

		self.sld_cutoff     = Slider(plt.axes([0.1,  0.91, 0.7, 0.02]), 'Cutoff',  1.,    2000.,  valinit=1000,   valstep=1.)
		self.sld_order      = Slider(plt.axes([0.1,  0.87, 0.7, 0.02]), 'Order',   2,     50,     valinit=5,      valstep=1)
		self.sld_fm_carrier = Slider(plt.axes([0.1,  0.83, 0.7, 0.02]), 'FM Freq', 3000., 20000., valinit=10000., valstep=100.)
		self.sld_fm_devsiat = Slider(plt.axes([0.1,  0.79, 0.7, 0.02]), 'FM Desv', 300.,  4000.,  valinit=1000.,  valstep=10.)
		self.sld_am_carrier = Slider(plt.axes([0.1,  0.75, 0.7, 0.02]), 'AM Freq', 3000., 20000., valinit=3000.,  valstep=100.)

		self.btn_am.on_clicked(self.selectAM)
		self.btn_amsc.on_clicked(self.selectAMSC)
		self.btn_fm.on_clicked(self.selectFM)

		self.btn_connect.on_clicked(self.connect)
		self.btn_disconnect.on_clicked(self.disconnect)

		self.sld_cutoff.on_changed(self.changeCutoff)
		self.sld_order.on_changed(self.changeOrder)
		self.sld_fm_carrier.on_changed(self.changeFmCarrier)
		self.sld_fm_devsiat.on_changed(self.changeFmDevsiat)
		self.sld_am_carrier.on_changed(self.changeAmCarrier)

		plt.show()

	def selectAM(self, evt):
		self.selectedMod = 'AM'

	def selectAMSC(self, evt):
		self.selectedMod = 'AMSC'

	def selectFM(self, evt):
		self.selectedMod = 'FM'

	def changeCutoff(self, val):
		self.modem.cutoff = val
		self.modem.normal_cutoff = self.modem.cutoff / self.modem.nyq

	def changeOrder(self, val):
		self.modem.order = val

	def changeFmCarrier(self, val):
		self.modem.fm_carrier_freq = val

	def changeFmDevsiat(self, val):
		self.modem.fm_desviation = val

	def changeAmCarrier(self, val):
		self.modem.am_carrier_freq = val


	def connect(self, event):
		self.client = Client()
		self.client.connect(self.input_ip.text)
		Thread(target=self.sendData).start()
		Thread(target=self.playSound).start()
		Thread(target=self.updatePlot).start()

	def disconnect(self, event):
		self.client.disconnect()

	def sendData(self):
		time.sleep(0.01)
		while self.client.isConnected():
			time.sleep(0.01)
			entrada = self.mic.read()
			mod = self.modulations[self.selectedMod](entrada)
			self.client.send(mod)

	def playSound(self):
		time.sleep(0.01)
		while self.client.isConnected():
			time.sleep(0.01)
			data = self.client.getBuffer().get_data().flatten()
			if not len(data): continue
			mod = data[-2205:]
			demod = self.demodulations[self.selectedMod](mod)
			self.speaker.play(demod)


	def updatePlot(self):
		time.sleep(0.01)
		while self.client.isConnected():
			time.sleep(0.01)
			frame = self.client.getBuffer().get_data().flatten()
			data = np.fromstring(frame, dtype=np.int16)
			if not len(data): continue

			self.axes[0].cla()
			self.axes[0].plot(data, color="black")

			self.axes[1].cla()
			self.axes[1].specgram(data, Fs=44100)

			data = self.demodulations[self.selectedMod](frame)
			data = np.fromstring(data, dtype=np.int16)

			self.axes[2].cla()
			self.axes[2].plot(data, color="black")

			self.axes[3].cla()
			self.axes[3].specgram(data, Fs=44100)

			plt.draw()
예제 #3
0
from mic import Mic
from speaker import Speaker
from modem import Modem

mic = Mic()
speaker = Speaker()
modem = Modem()

while True:
    entrada = mic.read()

    # modulado   =  modem.modAm(entrada)
    # demodulado = modem.demodAm(modulado)

    modulado = modem.modAmsc(entrada)
    demodulado = modem.demodAmsc(modulado)

    # modulado   = modem.modFm(entrada)
    # demodulado = modem.demodFm(modulado)

    speaker.play(demodulado)