(*Power content of angle modulation (FM and PM)
by Nasser M. Abbasi
version September 6 2009*)
Manipulate[
If[typeOfModulation == FM, k = Max[Min[k, 2], 0],
k = Max[Min[k, 3.5], 0]];
frequencyModulation[k, fc, fm, typeOfModulation, Am, Ac],
Grid[{
{
Item[Control[{{typeOfModulation, FM,
"select type of modulation"}, {FM -> "FM", PM -> "PM"},
ControlType -> SetterBar, ImageSize -> Tiny}]
, Alignment -> Left],
Item[Control[{{k, 1.14, "k, deviation constant "}, 0,
Dynamic[If[typeOfModulation == FM, 2, 3.5]], .01,
Appearance -> "Labeled", ImageSize -> Tiny}]
, Alignment -> Right]
},
{
Item[Control[{{Am, 1,
"\!\(\*SubscriptBox[\(A\), \(m\)]\), message amplitude "},
0.5, 1.5, .01, Appearance -> "Labeled", ImageSize -> Tiny}]
, Alignment -> Right],
Item[
Control[{{fc, 6.7,
"\!\(\*SubscriptBox[\(f\), \(\(c\)\(,\)\(\\\ \)\)]\)carrier \
frequency (hz)"}, 5, maxCarrierFreq, .01, Appearance -> "Labeled",
ImageSize -> Tiny}]
, Alignment -> Right]
},
{
Item[Control[{{Ac, 1,
"\!\(\*SubscriptBox[\(A\), \(c\)]\), carrier amplitude "}, .5,
1.5, .01, ImageSize -> Tiny, Appearance -> "Labeled"}]
, Alignment -> Right],
Item[Control[ {{fm, 0.88,
"\!\(\*SubscriptBox[\(f\), \(\(m\)\(,\)\(\\\ \)\)]\)message \
frequency (hz)"}, .18, maxMessageFreq, .01, Appearance -> "Labeled",
ImageSize -> Tiny}]
, Alignment -> Right]
}
},
Spacings -> {2, 0},
Frame -> None
],
ControlPlacement -> Top,
SynchronousUpdating -> False,
AutorunSequencing -> Automatic,
Initialization :>
(
maxCarrierFreq = 8;
maxMessageFreq = 1;
tmax = 4;
fontSizeForTitles = 14;
fontSizeForSubTitles = 11;
FM = 1;
PM = -1;
(********************************************************)
(* This is the main function called by Manipulate[] *)
(********************************************************)
frequencyModulation[k_, fc_, fm_, typeOfModulation_, Am_, Ac_] :=
Module[{message, carrier, wm, wc, msg, \[Beta]},
wm = 2 Pi fm;
wc = 2 Pi fc;
carrier = Ac Cos[wc t];
(*set \[Beta], the modulation index,
depending on the modulation type*)
If[typeOfModulation ==
FM, {message = Am Cos[wm t], \[Beta] = k Am/fm}, {message =
Am Sin[wm t], \[Beta] = k Am}];
GraphicsGrid[{
{
msg =
Style[
"modulation index \[Beta] = " <>
ToString[ NumberForm[\[Beta] , {3, 2}]],
fontSizeForSubTitles];
plotLabel =
Style[Column[{
Style[If[typeOfModulation == FM, "FM modulated carrier",
"PM modulated carrier"], fontSizeForTitles] ,
msg}
, Center]] ;
Plot[{Ac Cos[wc t + \[Beta] Sin[wm t] ], message}, {t, 0,
tmax },
Ticks -> {Automatic, Automatic},
AxesLabel -> {Style[Row[{Style["t", Italic], " (sec)"}],
Larger]}, PlotLabel -> plotLabel,
PlotStyle -> {Red, Blue},
AspectRatio -> 1/4
],
SpanFromLeft
},
{
frequencyPlot[fm, fc, \[Beta], Ac, Am], SpanFromLeft
}
,
{
powerRatioPlot[fm, \[Beta]], SpanFromLeft
}
},
Spacings -> {Scaled[.1], Scaled[.1]},
Frame -> {False, All},
Dividers -> None,
AspectRatio -> Full,
ImageSize -> {520, 390}]
];
(********************************************************)
(* This function generates the plot for the power ratio *)
(********************************************************)
powerRatioPlot[fm_, \[Beta]_] :=
Module[{bandwidth, nSideTermsToUse, data, bessel, tmp, n, xticks,
p1, p2, colors, plotLabel},
bandwidth = 2 (\[Beta] + 1) fm;
nSideTermsToUse = Floor[bandwidth/(2*fm)] + 1;
tmp = BesselJ[0, \[Beta]]^2;
bessel = Table[BesselJ[n, \[Beta]]^2, {n, 1, nSideTermsToUse}];
data =
Table[{n, tmp + 2 Total[bessel[[1 ;; n]]]}, {n, 1,
nSideTermsToUse}];
data = Insert[data, {0, tmp}, 1];
xticks = Table[{n, ToString[2 n]}, {n, 0, nSideTermsToUse}];
(*I do not know how to make lines joined and also make filling*)
\
(*as vertical lines using the same options as they conflict *)
\
(*so I make 2 plots one with vertical lines,
and one joined *)
colors =
Table[If[
n == 0, {Red, PointSize[.015]}, {Blue, PointSize[.015]}], {n,
0, nSideTermsToUse}];
plotLabel =
Style[Column[{
Style["power content (normalized) as a function of \
bandwidth", fontSizeForTitles] },
, Center]];
p1 = Show[ListPlot[{#[[2]]},
PlotLabel -> plotLabel ,
AspectRatio -> 1/4,
Ticks -> {xticks, {0, 0.25, 0.5, 0.75, 1}},
AxesOrigin -> {0, 0},
Filling -> Axis,
PlotStyle -> #[[1]],
FillingStyle -> #[[1, 1]],
AxesLabel -> {Style[
Column[{"number of", "sidbands"}, Center], Larger] },
Frame -> False,
Joined -> False] & /@ Transpose[{colors, data}],
PlotRange -> All];
p2 = ListPlot[data,
Joined -> True,
PlotStyle -> {Black, Dashed, Thin}];
Show[p1, p2]
];
(********************************************************)
(* This function generates the plot for the spectra *)
(********************************************************)
frequencyPlot[fm_, fc_, \[Beta]_, Ac_, Am_] :=
Module[{nSideTermsToUse, yValues, xValues, g, plotLabel, gLabels,
roundedYValues, bandwidth},
bandwidth = 2 (\[Beta] + 1) fm;
nSideTermsToUse = Round[bandwidth/(2*fm)] + 1;
yValues = (Ac/2) BesselJ[
Range[-nSideTermsToUse, nSideTermsToUse], \[Beta]];
(*flip negative phase indicated by some BesselJ results will be \
nagtive*)
Table[
If[yValues[[i]] < 0, yValues[[i]] = yValues[[i]]*-1,
yValues[[i]]], {i, 1, Length[yValues]}];
xValues =
Table[fc + n*fm, {n, -nSideTermsToUse, nSideTermsToUse}];
g = Table[{ If[n == nSideTermsToUse + 1, Red, Blue] ,
Line[{{xValues[[n]], 0}, {xValues[[n]], yValues[[n]]}}]}, {n,
1, Length[xValues]}];
roundedYValues = Round[yValues, 0.01];
gLabels =
Table[Text[
Style[ NumberForm[roundedYValues[[n]] , {3, 2}],
Small], {xValues[[n]], yValues[[n]] + 0.1 yValues[[n]]}, {-1,
0}, {0, 1}], {n, 1, Length[xValues]}];
plotLabel =
Column[{
Style["modulated carrier spectra (magnitude)",
fontSizeForTitles] ,
Row[{Style[
"bandwidth (98% of power) = " <>
ToString[ NumberForm[bandwidth, {3, 2}]] <> " hz",
fontSizeForSubTitles],
" ",
Style["number of sidbands = " <>
ToString[ 2 nSideTermsToUse ], fontSizeForSubTitles]}]}
, Center] ;
Show[ListPlot[{{fc, 0}},
PlotLabel -> plotLabel,
AxesOrigin -> {fc, 0},
Axes -> {True, False},
PlotRange -> {Automatic, {-.1 Max[yValues], 1.7*Max[yValues]}},
AspectRatio -> 1/4,
AxesLabel -> {Style[Row[{Style["f", Italic], " (hz)"}],
Larger]},
Ticks -> {Automatic, None}
],
Graphics[g], Graphics[gLabels]]
]
)
]