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/