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 QM, který
obsahuje funke :
-
public PointPairList ModulacniSignal(Data data, int
volba)
-
public PointPairList PasmovySignal(Data data1, Data
data2)
-
public PointPairList AmplitudoveSpektrum(Data[] data)
-
public PointPairList FazoveSpektrum(Data[] data)
-
public PointPairList VykonoveSpektrum(Data[] data)
kde
public Data(int Freq_mod, int
Freq_mod2, int DC_mod, int
Ampl_mod, TypSignalu TypSig_mod,
int Freq_pasm, 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 * fm);
else //jinak je cos
y = data.DC_mod + data.Ampl_mod * Math.Cos((float)i * 2 * 3.14 * fm);
vrat.Add(i, y);
}
//Generovani
pasmoveho signalu
for (float k = 0; k < meze;
k++, i += deltat)
{
//m1
if(data1.TypSig_mod == Data.TypSignalu.sin)
pomoc.Re = (data1.DC_mod + data1.Ampl_mod * Math.Sin((float)i * 2 * 3.14 * data1.Freq_mod));
else
pomoc.Re = (data1.DC_mod + data1.Ampl_mod * Math.Cos((float)i * 2 * 3.14 * data1.Freq_mod));
//m2
if (data2.TypSig_mod == Data.TypSignalu.sin)
pomoc.Im = (data2.DC_mod
+ data2.Ampl_mod * Math.Sin((float)i * 2 * 3.14 * data2.Freq_mod2));
else pomoc.Im = (data2.DC_mod + data2.Ampl_mod * Math.Cos((float)i * 2 * 3.14 * data2.Freq_mod2));
pomoc2.Re = Math.Cos((float)i * 2 * 3.14 * data1.Freq_pasm);
pomoc2.Im = Math.Sin((float)i * 2 * 3.14 * data1.Freq_pasm);
y = (pomoc.Re * pomoc2.Re) - (pomoc.Im *
pomoc2.Im);
vrat.Add(i, y);
index++;
}
//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; i++)
{
if (fftdata[i] != null)
vrat.Add(((double)(k[i] * data[0].Fvz)
/ sig.Count), fourierData.MagnitudeDot(fftdata[i]) / fourierData.dataDFT.Length);
}
//Fazove
spektrum
for (int i = 0; i < delka
- 1; i++)
{
if (fftdata[i] != null)
{
//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[0].Fvz) / sig.Count), fourierData.PhaseDot(fftdata[i]));
}
}
//Vykonove
spektrum
MyFourier.Complex[]
fftdata = mydft.fftshift(fourierData.dataDFT);
for (int
i = 0; i < delka; i++)
{
if (fftdata[i] != null)
vrat.Add(((double)(k[i]
* data[0].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/