V Programu jsou vytvořeny
funkce, které se zavolají s příslušnými parametry a následně nám vrátí
požadované data, které lze přímo vykreslit do grafu. Je zde soubor PM_FM, který
obsahuje funke :
-
public PointPairList
ModulacniSignal(Data data)
-
public PointPairList
PasmovySignal(TypModulaceUM typModulace, Data data)
-
public PointPairList
AmplitudoveSpektrum(TypModulaceUM typModulace,
Data data, SignalProSpektrumUM
signalSelect)
-
public PointPairList
FazoveSpektrum(TypModulaceUM typModulace, Data data, SignalProSpektrumUM
signalSelect)
-
public PointPairList
VykonoveSpektrum(TypModulaceUM typModulace, Data data, SignalProSpektrumUM
signalSelect)
kde :
public enum TypModulaceUM
{
FM = 0,
PM
}
// Freq_mod – frekvence
modulacniho signalu
// DC_mod – stejnosmerna
hodnota modulacniho signalu
// Ampl_mod – amplituda
modulacniho signalu
// TypSig_mod – typ modulacniho
signalu (sin, cos)
// Freq_pasm – frekvence
pasmoveho signalu
//Ac – zesileni nosne
//Index – index
frekvencni nebo fazove modulace
// period – perioda
zobrazeneho signalu
// time – cas zobrazeneho
signalu
public Data(int
Freq_mod, int DC_mod, int
Ampl_mod, TypSignalu TypSig_mod, int Freq_pasm,
int Ac, int
Index, int period, int
time)
//Generovani
modulacniho signalu
for (float i = 0; i < Math.Round((lenght - deltat), zaokrouhleni);
i = (float)Math.Round(i
+ deltat, zaokrouhleni))
{
if (Data.TypSignalu.sin
== data.TypSig_mod)
y = data.DC_mod + data.Ampl_mod * Math.Sin((float)i * 2 * 3.14 * data.Freq_mod);
else //jinak je cos
y = data.DC_mod + data.Ampl_mod * Math.Cos((float)i * 2 * 3.14 * data.Freq_mod);
}
//Generovani pasmoveho signalu
int meze = 0;
if (data.period != int.MinValue)
meze = (int)((data.Fvz / data.Freq_mod)) * data.period;
else meze = (int)((data.Fvz) *
(data.time / 1000f));
for (float
i = 0; i < meze; i += deltat)
{
if (typModulace
== TypModulaceUM.FM)
{
if (Data.TypSignalu.sin
== data.TypSig_mod)
Ft = data.Index * ( (data.Ampl_mod / (2 * data.Freq_mod * Math.PI))
* Math.Sin(2 * Math.PI * data.Freq_mod * (float)i));
else //jinak
je cos
Ft = data.Index * ( ((data.Ampl_mod / (2 * data.Freq_mod * Math.PI))
* Math.Cos(2 * Math.PI * data.Freq_mod * (float)i)));
}
else
{
if (Data.TypSignalu.sin
== data.TypSig_mod)
Ft = data.Index * (data.Ampl_mod * Math.Sin((float)i * 2 * 3.14 * data.Freq_mod) + data.DC_mod);
else //jinak
je cos
Ft = data.Index * (data.Ampl_mod * Math.Cos((float)i * 2 * 3.14 * data.Freq_mod) + data.DC_mod);
}
y = data.Ac * Math.Cos(2 * Math.PI * data.Freq_pasm* (float)i
+ Ft);
vrat.Add(i, y);
}
//Amplitudove spektrum
MyFourier.MyFourier
mydft = new
MyFourier.MyFourier();
MyFourier.FourierData
fourierData = mydft.DFT(mojedata, MyFourier.MyFourier.Type.prima);
int delka
= fourierData.dataDFT.Length;
int[] k = new int[delka];
for (int
i = 0; i < delka / 2; i++)
{
k[i] = (-(delka / 2)) + i;
}
for (int
i = delka / 2; i < delka;
i++)
{
k[i] = i - (delka / 2);
}
MyFourier.Complex[]
fftdata = mydft.fftshift(fourierData.dataDFT);
for (int i = 0; i < delka-1; i++)
vrat.Add(((double)(k[i]
* data.Fvz) / sig.Count), fourierData.MagnitudeDot(fftdata[i]) / fourierData.dataDFT.Length);
//Fazove spektrum
MyFourier.Complex[] fftdata
= mydft.fftshift(fourierData.dataDFT);
for (int
i = 0; i < delka-1; i++)
{
//vycisteni spektra
if ((fourierData.MagnitudeDot(fftdata[i]) / fourierData.dataDFT.Length < 0.01))
{
fftdata[i].Real = 0;
fftdata[i].Imag = 0;
}
vrat.Add(((double)(k[i]
* data.Fvz) / sig.Count), fourierData.PhaseDot(fftdata[i]));
}
//Vykonove spektrum
for (int i = 0; i < delka-1; i++)
vrat.Add(((double)(k[i]
* data.Fvz) / sig.Count), Math.Pow(fourierData.MagnitudeDot(fftdata[i]) / fourierData.dataDFT.Length, 2));
Pro
zobrazení písmen řeské abecedy byla vytořeny funkce :
-
ReckceZnaky.Velke
-
ReckceZnaky.Male
Pro práci
s komplexními čísly a výpočet fft byla použita
knihovna třetí strany Aforge Framework dostupná ze stránek
http://www.aforgenet.com/framework/