}
代码的第一条语句是先定义一个CChuangHanShu类对象hanshu,同时调用它的构造函数将mySignal1的地址传给CChuangHanShu类中定义的私有指针变量mySignal,它指向一个SigTranmit类对象。第二条是用来弹出窗函数选择对话框的,选窗函数的同时执行单选按钮的消息相应函数,即给mySignal1的私有变量c赋值。接着由c的值生成相应的窗函数存入变量Wn中,并由此生成低通滤波器并存在变量H1中,并对其进行DFT运算得出其频域的幅值存入变量A中,最后调用画图函数void Graph0(float S[],float Frep[])画出其时域和频域图,并分别显示在右边的时域波形和频域波形静态文本框中。其图如图4-3所示。
图4-3低通滤波器的时域波形和频域波形
进行窗函数选择的三个单选按钮同样也有消息响应函数,它们的功能就是根据用户所选窗给c赋值。这些消息响应函数是在CChuangHanShu.h中声明并在CChuangHanShu.cpp中定义的,其代码分别如下所示:
void CChuangHanShu::OnHanNing() {
mySignal->Setc (0); }
void CChuangHanShu::OnHaMing () { mySignal->Setc (1); }
void CChuangHanShu::OnBuLaiKeMan () {
mySignal->Setc (2); }
mySignal为一个指向SigTranmit类对象的指针,系统运行时,它指向类对象mySignal1。这里的Setc为SigTranmit类的公有成员函数,这里调用它来设置
mySignal的私有变量c的值,以便在低通滤波器的消息函数中进行窗函数的选择。
(3)当我们点击滤波器特性组合框中的带通滤波器的命令按钮时系统执行带通滤波器按钮的消息处理函数,其代码如下:
void CASK_ProDlg::OnBpf () {
int k;
for (k=0; k for (k=0; k< (N-1)/2; k++) { if (((float) freq*k/N>700) && ((float) freq*k/N<900)) Hb0 [k] = ((float) freq*k/N-700)/200; if(((float) freq*k/N>900) && ((float) freq*k/N<1100)) Hb0 [k] =1; if (((float) freq*k/N>1100) && ((float) freq*k/N<1300)) Hb0 [k] = (1300-(float) freq*k/N)/200; Hb0 [N-k] =Hb0 [k]; } mySignal1.SetHb (Hb0); mySignal1.Idft (mySignal1.GetHb ()); this->Graph0 (mySignal1.GetH2 (), mySignal1.GetHb ()); } 图4-4 带通滤波器的时域波形和频域波形 首先用频率采样法生成带通滤波器存入数组Hb0(它是ASK_ProDlg的私有数据成员),接着调用SetHb 将Hb0的值传给Hb,再对Hb进行IDFT运算得出其时域特性存入H2中,最后调用画图函数void Graph0(float S[],float Frep[]) 画出其时域和频域图,并分别显示在右边的时域波形和频域波形静态文本框中。如图4-4所示。 图4-5 基带信号的时域波形和频域波形 (4)单击发射机组合框中的基带信号按钮时系统执行基带信号按钮的消息相应函数,其代码如下: void CASK_ProDlg::OnBaseSignal () { UpdateData (TRUE); mySignal1.SetDigtal (nMyID, nIntensity); mySignal1.Basesignal (); this->Graph (mySignal1.GetSa (), mySignal1.GetA ()); } 首先调用UpdateData(TRUE)将数据从编辑框中传送到对应的控件变量上,因为若用户输入了新的数据则需要更新而不是采用默认值,这样就能使得用户输入的数据能及时传入系统。接着就是mySignal1调用它的成员函数void SetDigtal(int ID, int Intensity)将控件变量的值传给它的私有数据成员myID和myIntensity。其次调用成员函数void Basesignal()对学号编辑框里的数据进行编码、采样以及DFT运算,并将其时域及频域的数值分别存入Sa和A中;最后调用画图函数void Graph(float S[],float Frep[])画出其时域和频域图,并分别显示在右边的时域波形和频域波形静态文本框中。如图4-5所示。 (5)单击发射机组合框中的过低通命令按钮,则系统执行过低通按钮的消息响应函数,其代码如下: void CASK_ProDlg::OnPassLpf1 () { mySignal1.Lpf(); this->Graph (mySignal1.GetSa (), mySignal1.GetA ()); } 图4-6 信号过低通后的时域波形和频域波形 首先mySignal1调用它的成员函数void Lpf()进行信号过低通滤波器的一系列运算,并将最后得出的信号的时域数值及其频域的幅值分别存入Sa和A中;最后调用画图函数void Graph (float S[],float Frep[])画出其时域和频域图,并分别显示在右边的时域波形和频域波形静态文本框中。如图4-6所示。 (6)单击发射机组合框中的调制命令按钮,则系统执行调制按钮的消息响应函数,其代码如下: void CASK_ProDlg::OnModulate () { mySignal1.modulate (); this->Graph (mySignal1.GetSa (), mySignal1.GetA ()); } 首先mySignal1调用它的成员函数void modulate()实现对信号调制的一系列运算,并将最后得出的信号的时域数值及其频域的幅值分别存入Sa和A中;最后调用画图函数void Graph (float S[],float Frep[])画出其时域和频域图,并分别显示在右边的时域波形和频域波形静态文本框中。如图4-7所示: 图4-7 调制信号的时域波形和频域波形 图4-8 噪声信号的时域波形和频域波形 (7)单击噪声命令按钮,则系统执行噪声按钮的消息响应函数,其代码如下: void CASK_ProDlg::OnNoise() { mySignal1.Noise (mySignal1.GetmyIntensity ()); this->Graph (mySignal1.GetNo (), mySignal1.GetA ()); } 首先调用mySignal1的成员函数void Noise(float inten)生成高斯白噪声,并将最后得出的噪声信号的时域数值及其频域的幅值分别存入No和A中;最后调用画图函数void Graph (float S[],float Frep[])画出其时域和频域图,并分别显示在右边的时域波形和频域波形静态文本框中。如图4-8所示。 图4-9 过信道后信号的时域波形和频域波形 (8)单击信道命令按钮,则系统执行信道按钮的消息响应函数,其代码如下: void CASK_ProDlg::OnChannel () {