controldlg.cpp

来自「Visual C++编写的虚拟环绕声系统」· C++ 代码 · 共 574 行 · 第 1/2 页

CPP
574
字号
		FilterFile=fopen(FilterPathName,"rb");
		fread(FilterTimeData,sizeof(float),FilterTimeDataLength,FilterFile);
		fclose(FilterFile);	
		SetCurrentDirectory(lptDir);
		    free(lptDir);
		// 生成滤波器的频率值 FilterFreData
		ProduceFilterFreData();
	}
	else {
		    free(lptDir);
			return;
	}

}


void CControlDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default

	TCHAR   szText[16];  

	HorizontalCounter=(int)((((CSliderCtrl*)GetDlgItem(IDC_HORIZONTAL_SLIDER))->GetPos())); 
	wsprintf( szText, "%i", HorizontalCounter*10 );
	SetDlgItemText(IDC_HORIZONTALCOUNTER_STATIC, szText );

	VerticalCounter=(int)((((CSliderCtrl*)GetDlgItem(IDC_VERTICAL_SLIDER))->GetPos())-4);
	wsprintf( szText, "%i", VerticalCounter*10 );
	SetDlgItemText(IDC_VERTICALCOUNTER_STATIC, szText );
	
	SURCounter=(float)((((CSliderCtrl*)GetDlgItem(IDC_SUR_SLIDER))->GetPos()));
	wsprintf( szText, "%i", (int)SURCounter );
	SetDlgItemText(IDC_SURCOUNTER_STATIC, szText );
	
	MIDCounter=(float)((((CSliderCtrl*)GetDlgItem(IDC_MID_SLIDER))->GetPos()));
	wsprintf( szText, "%i", (int)MIDCounter );
	SetDlgItemText(IDC_MIDCOUNTER_STATIC, szText );
	
	DelayCounter=(int)((((CSliderCtrl*)GetDlgItem(IDC_DELAY_SLIDER))->GetPos()));
	wsprintf( szText, "%i", DelayCounter );
	SetDlgItemText(IDC_DELAYCOUNTER_STATIC, szText );
/*         
	F600HZCounter=(int)((((CSliderCtrl*)GetDlgItem(IDC_600HZ_SLIDER))->GetPos())-50);
	wsprintf( szText, "%i", F600HZCounter );
	SetDlgItemText(IDC_600HZCOUNTER_STATIC, szText );
		 
	F1KHZCounter=(int)((((CSliderCtrl*)GetDlgItem(IDC_1KHZ_SLIDER))->GetPos())-50);
	wsprintf( szText, "%i", F1KHZCounter );
	SetDlgItemText(IDC_1KHZCOUNTER_STATIC, szText );
		 
	F3KHZCounter=(int)((((CSliderCtrl*)GetDlgItem(IDC_3KHZ_SLIDER))->GetPos())-50);
	wsprintf( szText, "%i", F3KHZCounter );
	SetDlgItemText(IDC_3KHZCOUNTER_STATIC, szText );
		 
	F6KHZCounter=(int)((((CSliderCtrl*)GetDlgItem(IDC_6KHZ_SLIDER))->GetPos())-50);
	wsprintf( szText, "%i", F6KHZCounter );
	SetDlgItemText(IDC_6KHZCOUNTER_STATIC, szText );
		 
	F12KHZCounter=(int)((((CSliderCtrl*)GetDlgItem(IDC_12KHZ_SLIDER))->GetPos())-50);
	wsprintf( szText, "%i", F12KHZCounter );
	SetDlgItemText(IDC_12KHZCOUNTER_STATIC, szText );
		 
	F18KHZCounter=(int)((((CSliderCtrl*)GetDlgItem(IDC_18KHZ_SLIDER))->GetPos())-50);
	wsprintf( szText, "%i", F18KHZCounter );
	SetDlgItemText(IDC_18KHZCOUNTER_STATIC, szText );
*/		 
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CControlDlg::ProduceFilterFreData()
{
	int FilterTimeDataLength=128;
	for(int i=0;i<FilterTimeDataLength;i++)
	{
		FilterFreData[i].real=FilterTimeData[i];
		FilterFreData[i].imag=0;
	}
	
	for(i=FilterTimeDataLength;i<1024;i++)
	{
		FilterFreData[i].real=0;
		FilterFreData[i].imag=0;
	}
	FFT(FilterFreData,10);
}

void CControlDlg::FFT(COMPLEX * x, short m)
{
    static COMPLEX *w;           // used to store the w complex array 
    static int mstore = 0;       // stores m for future reference 
    static int n = 1;            // length of fft stored for future 

    COMPLEX u,temp,tm;
    COMPLEX *xi,*xip,*xj,*wptr;

    int i,j,k,l,le,windex;

    double arg,w_real,w_imag,wrecur_real,wrecur_imag,wtemp_real;

    if(m != mstore)
	{
		// free previously allocated storage and set new m
        if(mstore != 0) free(w);
        mstore = m;
        if(m == 0) return;       // if m=0 then done 
		
		// n = 2**m = fft length 
        n = 1 << m;
        le = n/2;

		// allocate the storage for w 
        w = (COMPLEX *) calloc(le-1,sizeof(COMPLEX));
        if (!w)
		{
			MessageBox(" FFT Memory Allocate Error!!",
						NULL,MB_OK|MB_ICONEXCLAMATION); 
			exit(1); 
		}

		// calculate the w values recursively 
        arg = 4.0*atan(1.0)/le;         // PI/le calculation 
        wrecur_real = w_real = cos(arg);
        wrecur_imag = w_imag = -sin(arg);
        xj = w;
        for (j = 1 ; j < le ; j++)
		{
            xj->real = (float)wrecur_real;
            xj->imag = (float)wrecur_imag;
            xj++;
            wtemp_real = wrecur_real*w_real - wrecur_imag*w_imag;
            wrecur_imag = wrecur_real*w_imag + wrecur_imag*w_real;
            wrecur_real = wtemp_real;
        }
    }

	// start FFT
    le = n;
    windex = 1;
    for (l = 0 ; l < m ; l++) 
	{
        le = le/2;
		// first iteration with no multiplies
        for(i = 0 ; i < n ; i = i + 2*le) 
		{
            xi = x + i;
            xip = xi + le;
            temp.real = xi->real + xip->real;
            temp.imag = xi->imag + xip->imag;
            xip->real = xi->real - xip->real;
            xip->imag = xi->imag - xip->imag;
            *xi = temp;
        }
		// remaining iterations use stored w 
        wptr = w + windex - 1;
        for (j = 1 ; j < le ; j++) 
		{
            u = *wptr;
            for (i = j ; i < n ; i = i + 2*le) 
			{
                xi = x + i;
                xip = xi + le;
                temp.real = xi->real + xip->real;
                temp.imag = xi->imag + xip->imag;
                tm.real = xi->real - xip->real;
                tm.imag = xi->imag - xip->imag;             
                xip->real = tm.real*u.real - tm.imag*u.imag;
                xip->imag = tm.real*u.imag + tm.imag*u.real;
                *xi = temp;
            }
            wptr = wptr + windex;
        }
        windex = 2*windex;
    }            

	// rearrange data by bit reversing 
    j = 0;
    for (i = 1 ; i < (n-1) ; i++) 
	{
        k = n/2;
        while(k <= j) {	j = j - k;  k = k/2; }
        j = j + k;
        if (i < j) 
		{
            xi = x + i;
            xj = x + j;
            temp = *xj;
            *xj = *xi;
            *xi = temp;
        }
    }
}

void CControlDlg::OnResetButton() 
{
	// TODO: Add your control notification handler code here

	///////////////////////
	// MY CODE STARTS HERE
	///////////////////////

	// 各个滑动条复位
	SURCounter=0;
	MIDCounter=0;
	DelayCounter=0;
	HorizontalCounter=0;
	VerticalCounter=0;
	F600HZCounter=0;
	F1KHZCounter =0;
	F3KHZCounter =0;
	F6KHZCounter =0;
	F12KHZCounter=0;
	F18KHZCounter=0;

	TCHAR   szText[16];  

	SURSlider=(CSliderCtrl*)GetDlgItem(IDC_SUR_SLIDER);
	SURSlider->SetPos((int)SURCounter);
	wsprintf( szText, "%i",  (int)SURCounter);
	SetDlgItemText(IDC_SURCOUNTER_STATIC, szText);
	
	MIDSlider=(CSliderCtrl*)GetDlgItem(IDC_MID_SLIDER);
	MIDSlider->SetPos((int)MIDCounter);
	wsprintf( szText, "%i",  (int)MIDCounter);
	SetDlgItemText(IDC_MIDCOUNTER_STATIC, szText);
	
	DelaySlider=(CSliderCtrl*)GetDlgItem(IDC_DELAY_SLIDER);
	DelaySlider->SetPos(DelayCounter);
	wsprintf( szText, "%i",  DelayCounter);
	SetDlgItemText(IDC_DELAYCOUNTER_STATIC, szText);
	
	HorizontalSlider=(CSliderCtrl*)GetDlgItem(IDC_HORIZONTAL_SLIDER);
	HorizontalSlider->SetPos(HorizontalCounter);
	wsprintf( szText, "%i", (HorizontalCounter*10) );
	SetDlgItemText(IDC_HORIZONTALCOUNTER_STATIC, szText);

	VerticalSlider=(CSliderCtrl*)GetDlgItem(IDC_VERTICAL_SLIDER);
	VerticalSlider->SetPos(VerticalCounter+4);
	wsprintf( szText, "%i", (VerticalCounter*10) );
	SetDlgItemText(IDC_VERTICALCOUNTER_STATIC, szText);
	/*
	////////////////////////////////////////////////////////////
	F600HZSlider=(CSliderCtrl*)GetDlgItem(IDC_600HZ_SLIDER);
	F600HZSlider->SetPos(F600HZCounter+50);
	wsprintf( szText, "%i", F600HZCounter );
	SetDlgItemText(IDC_600HZCOUNTER_STATIC, szText );
	
	F1KHZSlider=(CSliderCtrl*)GetDlgItem(IDC_1KHZ_SLIDER);
	F1KHZSlider->SetPos(F1KHZCounter+50);
	wsprintf( szText, "%i", F1KHZCounter );
	SetDlgItemText(IDC_1KHZCOUNTER_STATIC, szText );

	F3KHZSlider=(CSliderCtrl*)GetDlgItem(IDC_3KHZ_SLIDER);
	F3KHZSlider->SetPos(F3KHZCounter+50);
	wsprintf( szText, "%i", F3KHZCounter );
	SetDlgItemText(IDC_3KHZCOUNTER_STATIC, szText );

	F6KHZSlider=(CSliderCtrl*)GetDlgItem(IDC_6KHZ_SLIDER);
	F6KHZSlider->SetPos(F6KHZCounter+50);
	wsprintf( szText, "%i", F6KHZCounter );
	SetDlgItemText(IDC_6KHZCOUNTER_STATIC, szText );

	F12KHZSlider=(CSliderCtrl*)GetDlgItem(IDC_12KHZ_SLIDER);
	F12KHZSlider->SetPos(F12KHZCounter+50);
	wsprintf( szText, "%i", F12KHZCounter );
	SetDlgItemText(IDC_12KHZCOUNTER_STATIC, szText );

	F18KHZSlider=(CSliderCtrl*)GetDlgItem(IDC_18KHZ_SLIDER);
	F18KHZSlider->SetPos(F18KHZCounter+50);
	wsprintf( szText, "%i", F18KHZCounter );
	SetDlgItemText(IDC_18KHZCOUNTER_STATIC, szText );
*/
	// 滤波器恢复缺省值
	for (int i=0;i<128;i++)	FilterTimeData[i]=DefaultFilterTimeData[i];
	ProduceFilterFreData();

	//////////////////////
	// MY CODE ENDS HERE
	//////////////////////
}

void CControlDlg::OnOutofmemoryDelaySlider(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	
	*pResult = 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?