{"nbformat_minor": 0, "cells": [{"source": "EE120 Fall 2016 PS 8, Quadrature amplitude modulation for 4 channels", "cell_type": "markdown", "metadata": {}}, {"source": "To ouput python notebook to printable format, use ``ipython nbconvert file.ipynb'' from command prompt. You may need to install pandoc first.", "cell_type": "markdown", "metadata": {}}, {"execution_count": 12, "cell_type": "code", "source": "print 4+5 # check to see if iPython is running...", "outputs": [{"output_type": "stream", "name": "stdout", "text": "9\n"}], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 13, "cell_type": "code", "source": "%pylab", "outputs": [{"output_type": "stream", "name": "stdout", "text": "Using matplotlib backend: Qt4Agg\nPopulating the interactive namespace from numpy and matplotlib\n"}, {"output_type": "stream", "name": "stderr", "text": "WARNING: pylab import has clobbered these variables: ['rate']\n`%matplotlib` prevents importing * from pylab and numpy\n"}], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 14, "cell_type": "code", "source": "import numpy as np\nimport scipy as sp\nprint 'imported numpy and scipy'\nimport matplotlib.pyplot as plt\n%matplotlib inline\nfrom scipy.io import wavfile\nprint 'numpy version is', np.__version__\nprint 'finished importing'", "outputs": [{"output_type": "stream", "name": "stdout", "text": "imported numpy and scipy\nnumpy version is 1.9.2\nfinished importing\n"}], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 15, "cell_type": "code", "source": "# Graphing helper function\ndef setup_graph(title='', x_label='', y_label='', fig_size=None):\n fig = plt.figure()\n if fig_size != None:\n fig.set_size_inches(fig_size[0], fig_size[1])\n ax = fig.add_subplot(111)\n ax.set_title(title)\n ax.set_xlabel(x_label)\n ax.set_ylabel(y_label)", "outputs": [], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 16, "cell_type": "code", "source": "# Write signal to .wav files after down sampling by 16 and scaling\ndef wavwrite(name,sig,length):\n rate1 = 44100 # CD audio quality,\n out = np.zeros(length/16)\n out=sig.real[0:length:16] # downsample\n scale = 32767.0/(max(np.max(out),-np.min(out)))\n out = np.multiply(scale,out)\n wavfile.write(name, rate1, out.astype(np.int16)) # 16 bit integer\n print 'wrote file',name", "outputs": [], "metadata": {"collapsed": true, "trusted": true}}, {"execution_count": 17, "cell_type": "code", "source": "# import file\nfrom scipy.io import wavfile\nrate,data= wavfile.read('xmit-signal.wav') # 16 bit data from transmitter\nprint 'rate =', rate\nprint 'data =', data\nlength = np.size(data)\nprint 'length = ', length\nk = np.linspace(0,length-1,length)\n\n####################\n# parameters used:\ndt = 1.0/(44.1*16)*1e-3 # sample period\nprint 'Ts =', dt\ntime = dt * np.linspace(0,length-1,length)\nsignal = np.zeros(length)\nomega_c = 2.0 * np.pi * 3e5\nomega_d = 2.0 * np.pi * 3.16e5 # use channel spacing of 16 kHz", "outputs": [{"output_type": "stream", "name": "stdout", "text": "rate = 44100\ndata = [ -837 414 -10 ..., -1665 1308 -870]\nlength = 4194304\nTs = 1.41723356009e-06\n"}], "metadata": {"collapsed": false, "trusted": true}}, {"source": "Need to specify $k_{min}$, $k_{max}$, $k_{c}$, $k_{d}$ parameters in next cell.", "cell_type": "markdown", "metadata": {}}, {"execution_count": 23, "cell_type": "code", "source": "##################\n## PARAMETERS TO BE DETERMINED\n\nkc = np.int(length*omega_c/(2*np.pi/dt)) # CHANGE THIS\nkd = np.int(length*omega_d/(2*np.pi/dt)) # change this\nprint 'k at wc=', kc\nprint 'k at wd=', kd\n\nk_min = 48000 # change this value\nk_max = 3*48000 # kc+full width of omega_d channel", "outputs": [{"output_type": "stream", "name": "stdout", "text": "k at wc= 1783292\nk at wd= 1878401\n"}], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 24, "cell_type": "code", "source": "# plot FFT of modulated signal near carrier frequency\nkcarrier = kc\nY = np.fft.fft(data) \nsetup_graph(title='FFT of input data', x_label='$k$', y_label='$Y[k]$', fig_size=(6,3))\n_ = plt.plot(k[kcarrier-k_min:kcarrier+k_max],Y[kcarrier-k_min:kcarrier+k_max])", "outputs": [{"output_type": "display_data", "data": {"image/png": "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\nzMyGi5OQmZll4yRkZmbZOAmZmVk2TkJmZpaNk5CZmWXjJGRmZtk4CZmZWTZOQmZmlo2TkJmZZeMk\nZGZm2TgJmZlZNk5CZmaWjZOQmZll4yRkZmbZOAmZmVk2TkJmZpaNk5CZmWXjJGRmZtnUKglJOkjS\nTZKekbTDGOXulnSDpAWSrqoyxn4kaSR3DHXhbbGSt8VK3hb51CoJATcCBwCXtSkXwEhEbB8Rc3of\nVt8byR1AjYzkDqBGRnIHUCMjuQMYVmvmDqAsIm4FkNRJ8Y4KmZlZfdWtJtSpAH4m6RpJ78kdjJmZ\nTYwiotoVShcDM5vMOjYizk9lLgU+FhHXtljGxhFxn6TnAhcDH4qIyxvKVPvBzMwGRERU1tJUeXNc\nROzZhWXcl14fkPRDYA5weUMZN9eZmdVcnZvjmiYRSetKWi8NPxvYi6JDg5mZ9ZlaJSFJB0haBOwM\nXCjpojR9E0kXpmIzgcslXQdcCVwQET/NE7GZmU1G5eeEzMzMRtWiJiTpVElLJd1YmnZmuhh1gaTf\nSVpQmneMpIWSbpW0V2n6jpJuTPO+Vpr+LElnpem/lvS80rxDJd2e/t5Zmr6FpCvTe86UNLW3W2HF\nejveFpJmS3qiNO+k0nsGdVvMkXRV+rxXS9qpNG/Y9oum22JI94uXSvqViovYz1Nqsk/zhm2/aLot\nartfRET2P2A3YHvgxhbzTwA+mYa3Ba4DpgKzgTtYWaO7CpiThucB+6ThI4GT0vDbgDPT8IbAncD0\n9HcnsH6a933grWn4ZOB9NdwWs8coN5DbApgP7J2G9wUuHdb9YoxtMYz7xdXAbmn4MOBTQ7xftNoW\ntdwver6RxrExm24gig4K9wJbpfFjgKNK839McQ5pY+CW0vSDgVNKZV6RhtcEHkjDhwAnl95zSnqf\ngAeANdL0nYEf13BbtCo3sNsCOKO0gx8C/Oew7hdjbIth3C8eKQ3PAm4a4v2i1bao5X5Ri+a4NnYD\nlkbEnWl8E2Bxaf5iYNMm05ek6aTXRQAR8TTwqKSNxljWhhRf5PImy8qpcVsAbJGq1vMlvSpN25TB\n3RZHA1+SdC/wRYqDDAznftFqW8Dw7Rc3Sdo/DR9EcfCF4dwvWm0LqOF+0Q9J6BDgexWuLypc13g1\nbovfA7MiYnvgo8D3ym3hXVDHbfFt4MMRsTnwj8CpFa23n7bFMO4XhwNHSroGmAY8VdF6+2lb1HK/\nqHUSkrQmxQ1NzypNXsKqmX0ziiy8JA03Th99z+alZa4fEX9ssqxZadpDwHRJa5SWtaQLH2nCmm2L\niHgqIh5Ow9dStMtuzWBvizkR8cM0fDbFhcownPtF020xjPtFRNwWEXtHxMuBMyk+MwzhftFqW9R1\nv6h1EgL2oGir/H1p2nnAwZLWkrQFxUa8KiL+APxJ0iskCXgHcG7pPYem4QOBS9LwT4G9JE2XtAGw\nJ/CTKBozL6WoypLe+6PefMSOrbYtJD1H0pQ0vCXFtrgrijtKDOq2uEPS7mn4NcDtaXgY94um22IY\n9wsVt/AiHfw+SXFCHIZwv2i1LWq7X1R18qzNibUzKKqKT1K0Px6Wpp8GvLdJ+WMperncSuodlKbv\nSHH3hDuAr5emP4uix8ZC4NfA7NK8w9L0hcChpelbUFwMu5Ci9jG1btsCeDPwW2AB8BvgdQO6LZ4a\n3RbAy1Ms1wG/ArYfsv2i7bYYwv3icODDwG3p77MN5Ydpv2i5Leq6X/hiVTMzy6buzXFmZjbAnITM\nzCwbJyEzM8vGScjMzLJxEjIzs2ychMzMLBsnITMzy8ZJyMzMsnESMquQpDdKuix3HGZ14SRkVq2F\nFLfYMTOchMyqtgtwRe4gzOrCScisWnOABZLeLOk3uYMxy81JyKxa2wI7RcQ5wKvaFTYbdGvmDsBs\nWEialgYPkLQ8Vj6QzmxoOQmZVWcn4ALgx8BBkp6MiHmZYzLLys1xZtV5IcVTJxcD6wCP5g3HLD8/\n1M7MzLJxTcjMzLJxEjIzs2ychMzMLBsnITMzy8ZJyMzMsnESMjOzbJyEzMwsm/8Pxmdyo2T06c8A\nAAAASUVORK5CYII=\n", "text/plain": ""}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}, {"source": "Specify digital low pass filter $H[k]$ with cutoff of 8 kHz", "cell_type": "markdown", "metadata": {}}, {"execution_count": 26, "cell_type": "code", "source": "# specify low pass filter\nH = np.zeros(length)\nk_cutoff = np.int(length*8.00e3*dt)\nprint 'reconstruction k_cutoff =', k_cutoff\n# need hanning window to keep from ringing \nH[0:k_cutoff+1]=16\nH[length-k_cutoff:length]=16 # setup low pass filter with high and low", "outputs": [{"output_type": "stream", "name": "stdout", "text": "reconstruction k_cutoff = 47554\n"}], "metadata": {"collapsed": false, "trusted": true}}, {"source": "In the next cell enter code for calculating recovered signals s1[n], s2[n], s3[n], s4[n]", "cell_type": "markdown", "metadata": {}}, {"execution_count": 27, "cell_type": "code", "source": "# code here to extract s1....s4 from ``data''\ntime = dt * np.linspace(0,length-1,length)\ncoswc = np.cos(omega_c*time) \ncoswd = np.cos(omega_d*time) \nsinwc = np.sin(omega_c*time) \nsinwd = np.sin(omega_d*time) \nprint 'cos/sin setup done'\n\n# convert to baseband then filter\nsig1 = np.multiply(coswc,data)\nsig2 = np.multiply(sinwc,data)\nsig3 = np.multiply(coswd,data)\nsig4 = np.multiply(sinwd,data)\nprint 'convert to baseband'", "outputs": [{"output_type": "stream", "name": "stdout", "text": "cos/sin setup done\nconvert to baseband\n"}], "metadata": {"scrolled": true, "collapsed": false, "trusted": true}}, {"execution_count": 28, "cell_type": "code", "source": "# perform filtering and write data\n#low pass first channel\nSig1 = np.fft.fft(sig1) \nY = np.multiply(Sig1,H)\ns1 = np.fft.ifft(Y)\n\nSig2 = np.fft.fft(sig2) \nY = np.multiply(Sig2,H)\ns2 = np.fft.ifft(Y)\n\nSig3 = np.fft.fft(sig3) \nY = np.multiply(Sig3,H)\ns3 = np.fft.ifft(Y)\n\nSig4 = np.fft.fft(sig4) \nY = np.multiply(Sig4,H)\ns4 = np.fft.ifft(Y)", "outputs": [], "metadata": {"collapsed": true, "trusted": true}}, {"execution_count": 29, "cell_type": "code", "source": "# this cell writes all data for you, and plots S1[k]\nwavwrite('sig1.wav',s1,length)\nwavwrite('sig2.wav',s2,length)\nwavwrite('sig3.wav',s3,length)\nwavwrite('sig4.wav',s4,length)", "outputs": [{"output_type": "stream", "name": "stdout", "text": "wrote file sig1.wav\nwrote file sig2.wav\nwrote file sig3.wav\nwrote file sig4.wav\n"}], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 30, "cell_type": "code", "source": "# plot FFT of s1\nSig1 = np.fft.fft(s1) \nsetup_graph(title='FFT of s1', x_label='$k$', y_label='$S1[k]$', fig_size=(12,3))\nplt.subplot(1,2,1)\n_ = plt.plot(k[0:2*k_cutoff],Sig1.real[0:2*k_cutoff],'b')\nylabel('real')\nplt.subplot(1,2,2)\n_ = plt.plot(k[0:2*k_cutoff],Sig1.imag[0:2*k_cutoff],'g')\nylabel('Imag')\nxlabel('k')", "outputs": [{"execution_count": 30, "output_type": "execute_result", "data": {"text/plain": ""}, "metadata": {}}, {"output_type": "display_data", "data": {"image/png": "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\n", "text/plain": ""}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": null, "cell_type": "code", "source": "", "outputs": [], "metadata": {"collapsed": true, "trusted": true}}], "nbformat": 4, "metadata": {"kernelspec": {"display_name": "Python 2", "name": "python2", "language": "python"}, "language_info": {"mimetype": "text/x-python", "nbconvert_exporter": "python", "version": "2.7.9", "name": "python", "file_extension": ".py", "pygments_lexer": "ipython2", "codemirror_mode": {"version": 2, "name": "ipython"}}}}