====== FM spectrum analysis ====== In this demo, we will look at the spectrum of a frequency modulated signal, with the intent of exploring the effect of overmodulation on bandwidth. The circuit is simple, just a voltage source, with a Spice-style "SFFM" waveform. We will use parameters to tinker with the signal, and the Fourier command to display the spectrum. You could calculate the spectrum using Bessel functions, but we will look at it with simulation. ===== Setting up ===== First, the circuit. Enter it with the "build" command: gnucap> build > v1 ( 1 0 ) sffm (carrier={carrier} modindex={mod/signal} signal={signal}) > **** blank line exits build mode gnucap> Now, set up the parameters: gnucap> param carrier=10Meg gnucap> param signal=10K gnucap> param mod=75K This sets up a signal of 10 KHz with the usual maximum deviation of 75 KHz. This is not overmodulated. I chose a carrier frequency of 10 MHz for convenience. 100 MHz would be more realistic but would take longer to run. It doesn't really matter, and 10 MHz is close to the usual intermediate frequency of 10.7 MHz. Now, set up the sweep parameters: gnucap> param start={carrier-2*(mod+signal)} gnucap> param stop={carrier+2*(mod+signal)} gnucap> param step={signal} Carson's rule estimates the bandwidth to be 2*(mod+signal), so we will cover a range of twice that, in steps equal to the modulating frequency. If you look at the Bessel functions, you will see that this is corresponds to the actual signal. Now, set up a probe: gnucap> probe fourier v(1) ===== The first run ===== Try one .. look at the spectrum: gnucap> fourier {start} {stop} {step} You will see the time points of a transient run, then the spectrum over the range you asked for. # v(1) --------- actual --------- -------- relative -------- #freq value dB phase value dB phase 9.83Meg 7.2578u -102.78 93.604 20.494u -93.77 -179.033 9.84Meg 31.322u -90.08 -86.484 88.446u -81.07 0.879 9.85Meg 126.38u -77.97 93.428 356.88u -68.95 -179.209 9.86Meg 474.21u -66.48 -86.660 0.0013391 -57.46 0.703 9.87Meg 0.001644 -55.68 93.252 0.0046423 -46.67 -179.385 9.88Meg 0.005225 -45.64 -86.836 0.014754 -36.62 0.527 9.89Meg 0.015076 -36.43 93.076 0.042571 -27.42 -179.561 9.9Meg 0.038998 -28.18 -87.012 0.11012 -19.16 0.352 9.91Meg 0.088919 -21.02 92.900 0.25108 -12.00 -179.736 9.92Meg 0.17441 -15.17 -87.188 0.49248 -6.15 0.176 9.93Meg 0.28315 -10.96 92.725 0.79954 -1.94 -179.912 9.94Meg 0.35414 -9.02 -87.363 1. 0.00 -0.000 9.95Meg 0.28347 -10.95 92.549 0.80046 -1.93 179.912 9.96Meg 0.023825 -32.46 -87.539 0.067275 -23.44 -0.176 9.97Meg 0.25806 -11.77 -87.627 0.7287 -2.75 -0.264 9.98Meg 0.23027 -12.76 92.285 0.65023 -3.74 179.648 9.99Meg 0.13525 -17.38 92.197 0.38191 -8.36 179.561 10.Meg 0.26634 -11.49 -87.891 0.75207 -2.47 -0.527 10.01Meg 0.13525 -17.38 -87.979 0.38191 -8.36 -0.615 10.02Meg 0.23027 -12.76 91.934 0.65023 -3.74 179.297 10.03Meg 0.25806 -11.77 91.846 0.7287 -2.75 179.209 10.04Meg 0.023825 -32.46 -88.242 0.067275 -23.44 -0.879 10.05Meg 0.28347 -10.95 -88.330 0.80046 -1.93 -0.967 10.06Meg 0.35414 -9.02 -88.418 1. -0.00 -1.055 10.07Meg 0.28315 -10.96 -88.506 0.79954 -1.94 -1.143 10.08Meg 0.17441 -15.17 -88.594 0.49248 -6.15 -1.230 10.09Meg 0.088919 -21.02 -88.682 0.25108 -12.00 -1.318 10.1Meg 0.038998 -28.18 -88.770 0.11012 -19.16 -1.406 10.11Meg 0.015076 -36.43 -88.857 0.042571 -27.42 -1.494 10.12Meg 0.005225 -45.64 -88.945 0.014754 -36.62 -1.582 10.13Meg 0.001644 -55.68 -89.033 0.0046423 -46.67 -1.670 10.14Meg 474.22u -66.48 -89.121 0.0013391 -57.46 -1.758 10.15Meg 126.38u -77.97 -89.209 356.88u -68.95 -1.846 10.16Meg 31.323u -90.08 -89.297 88.447u -81.07 -1.934 10.17Meg 7.2581u -102.78 -89.385 20.495u -93.77 -2.021 gnucap> As a quick check .. For a modulation index of 7.5, the fourth sideband should have a null, or close to it. It does. Another quick check .. Carson's rule says the bandwidth should be about 2*(mod+signal) or 2*(10K+75K), or 85K on each side. It's pretty close. It looks like the real bandwidth is probably a little more. ===== Now experiment ===== Let's try a modulating frequency of 50 KHz, roughly the top of the stereo subcarrier. gnucap> param signal=50k gnucap> fourier #Time v(1) 0.0025 -0.99968 0.0025 0.8 0.0025199 0.76861 0.00252 -0.99968 # v(1) --------- actual --------- -------- relative -------- #freq value dB phase value dB phase 9.75Meg 0.0017994 -54.90 94.307 0.0032251 -49.83 1.758 9.8Meg 0.011768 -38.59 -86.133 0.021092 -33.52 -178.682 9.85Meg 0.060964 -24.30 93.428 0.10927 -19.23 0.879 9.9Meg 0.23209 -12.69 -87.012 0.41598 -7.62 -179.561 9.95Meg 0.55794 -5.07 92.549 1. 0.00 0.000 10.Meg 0.51183 -5.82 -87.891 0.91736 -0.75 179.561 10.05Meg 0.55794 -5.07 -88.330 1. -0.00 179.121 10.1Meg 0.23209 -12.69 -88.770 0.41598 -7.62 178.682 10.15Meg 0.060964 -24.30 -89.209 0.10927 -19.23 178.242 10.2Meg 0.011768 -38.59 -89.648 0.021092 -33.52 177.803 10.25Meg 0.0017994 -54.90 -90.088 0.0032251 -49.83 177.363 gnucap> Mod index is 1.5, so the spectrum is simpler, Carson's rule predicts 50K+75K, or 125K each side. Again, it seems the real signal takes more space. Check the Bessel functions, from a graph ... about .55, .55, .2 .. it matches as well as I read the graph. The signal is really pretty wide. Try half of the deviation .. gnucap> param mod=37.5K gnucap> fourier #Time v(1) 0.00252 -0.99952 0.0025399 0.75896 0.00254 -0.99952 # v(1) --------- actual --------- -------- relative -------- #freq value dB phase value dB phase 9.85Meg 0.0084844 -41.43 93.428 0.0098171 -40.16 -178.682 9.9Meg 0.067074 -23.47 -87.012 0.07761 -22.20 0.879 9.95Meg 0.34924 -9.14 92.549 0.4041 -7.87 -179.561 10.Meg 0.86424 -1.27 -87.891 1. 0.00 -0.000 10.05Meg 0.34924 -9.14 -88.330 0.4041 -7.87 -0.439 10.1Meg 0.067074 -23.47 -88.770 0.07761 -22.20 -0.879 10.15Meg 0.0084844 -41.43 -89.209 0.0098171 -40.16 -1.318 10.2Meg 801.07u -61.93 -89.648 926.9u -60.66 -1.758 gnucap> So now you see why the FCC limit on deviation is lower for higher modulation frequencies. Let's try overmodulating. gnucap> param signal=10K gnucap> param mod=150K gnucap> fourier # v(1) --------- actual --------- -------- relative -------- #freq value dB phase value dB phase 9.68Meg 6.6294n -163.57 0.001 23.786n -152.47 -179.999 9.69Meg 26.707n -151.47 180.000 95.822n -140.37 -0.000 9.7Meg 103.74n -139.68 0.000 372.23n -128.58 -180.000 9.71Meg 388.29n -128.22 180.000 1.3931u -117.12 -0.000 9.72Meg 1.3976u -117.09 0.000 5.0145u -106.00 -180.000 9.73Meg 4.8295u -106.32 180.000 17.328u -95.23 -0.000 9.74Meg 15.989u -95.92 0.000 57.365u -84.83 -180.000 9.75Meg 50.597u -85.92 180.000 181.54u -74.82 -0.000 9.76Meg 152.67u -76.32 -0.000 547.76u -65.23 -180.000 9.77Meg 437.95u -67.17 180.000 0.0015713 -56.07 -0.000 9.78Meg 0.0011904 -58.49 -0.000 0.0042709 -47.39 -180.000 9.79Meg 0.0030538 -50.30 180.000 0.010957 -39.21 -0.000 9.8Meg 0.0073602 -42.66 -0.000 0.026408 -31.57 -180.000 9.81Meg 0.016574 -35.61 180.000 0.059464 -24.51 0.000 9.82Meg 0.034626 -29.21 -0.000 0.12423 -18.12 -180.000 9.83Meg 0.066529 -23.54 180.000 0.2387 -12.44 0.000 9.84Meg 0.11617 -18.70 -0.000 0.41682 -7.60 -180.000 9.85Meg 0.18131 -14.83 180.000 0.65051 -3.73 0.000 9.86Meg 0.24644 -12.17 -0.000 0.8842 -1.07 -180.000 9.87Meg 0.27871 -11.10 180.000 1. 0.00 0.000 9.88Meg 0.23667 -12.52 -0.000 0.84913 -1.42 180.000 9.89Meg 0.09995 -20.00 180.000 0.35861 -8.91 -0.000 9.9Meg 0.090072 -20.91 180.000 0.32317 -9.81 -0.000 9.91Meg 0.22005 -13.15 -0.000 0.7895 -2.05 180.000 9.92Meg 0.17398 -15.19 180.000 0.62424 -4.09 -0.000 9.93Meg 0.034464 -29.25 180.000 0.12365 -18.16 -0.000 9.94Meg 0.20615 -13.72 -0.000 0.73964 -2.62 180.000 9.95Meg 0.13046 -17.69 180.000 0.46806 -6.59 -0.000 9.96Meg 0.11918 -18.48 180.000 0.4276 -7.38 -0.000 9.97Meg 0.19402 -14.24 -0.000 0.69612 -3.15 180.000 9.98Meg 0.041572 -27.62 -0.000 0.14915 -16.53 180.000 9.99Meg 0.2051 -13.76 180.000 0.73589 -2.66 -0.000 10.Meg 0.014224 -36.94 180.000 0.051036 -25.84 -0.000 10.01Meg 0.2051 -13.76 -0.000 0.73589 -2.66 180.000 10.02Meg 0.041572 -27.62 -0.000 0.14915 -16.53 180.000 10.03Meg 0.19402 -14.24 180.000 0.69612 -3.15 -0.000 10.04Meg 0.11918 -18.48 180.000 0.4276 -7.38 -0.000 10.05Meg 0.13046 -17.69 -0.000 0.46806 -6.59 180.000 10.06Meg 0.20615 -13.72 -0.000 0.73964 -2.62 180.000 10.07Meg 0.034464 -29.25 -0.000 0.12365 -18.16 180.000 10.08Meg 0.17398 -15.19 180.000 0.62424 -4.09 -0.000 10.09Meg 0.22005 -13.15 180.000 0.7895 -2.05 -0.000 10.1Meg 0.090072 -20.91 180.000 0.32317 -9.81 -0.000 10.11Meg 0.09995 -20.00 -0.000 0.35861 -8.91 180.000 10.12Meg 0.23667 -12.52 -0.000 0.84913 -1.42 180.000 10.13Meg 0.27871 -11.10 -0.000 1. -0.00 180.000 10.14Meg 0.24644 -12.17 -0.000 0.8842 -1.07 180.000 10.15Meg 0.18131 -14.83 -0.000 0.65051 -3.73 180.000 10.16Meg 0.11617 -18.70 -0.000 0.41682 -7.60 180.000 10.17Meg 0.066529 -23.54 -0.000 0.2387 -12.44 180.000 10.18Meg 0.034626 -29.21 -0.000 0.12423 -18.12 180.000 10.19Meg 0.016574 -35.61 -0.000 0.059464 -24.51 180.000 10.2Meg 0.0073602 -42.66 -0.000 0.026408 -31.57 180.000 10.21Meg 0.0030538 -50.30 -0.000 0.010957 -39.21 180.000 10.22Meg 0.0011904 -58.49 -0.000 0.0042709 -47.39 -180.000 10.23Meg 437.95u -67.17 -0.000 0.0015713 -56.07 -180.000 10.24Meg 152.67u -76.32 -0.000 547.76u -65.23 -180.000 10.25Meg 50.597u -85.92 0.000 181.54u -74.82 -180.000 10.26Meg 15.989u -95.92 0.000 57.365u -84.83 -180.000 10.27Meg 4.8295u -106.32 0.000 17.328u -95.23 -180.000 10.28Meg 1.3976u -117.09 0.000 5.0145u -106.00 -180.000 10.29Meg 388.29n -128.22 0.000 1.3932u -117.12 -180.000 10.3Meg 103.75n -139.68 0.000 372.26n -128.58 -180.000 10.31Meg 26.712n -151.47 0.000 95.838n -140.37 -180.000 10.32Meg 6.6384n -163.56 0.001 23.818n -152.46 -179.999 gnucap> As expected, the bandwidth is a a little more than 2*160k. That's enough for now.