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 + -
显示快捷键?