SignalProcess.cpp
上传用户:hldfqc
上传日期:2022-07-25
资源大小:12k
文件大小:10k
源码类别:

数学计算

开发平台:

Visual C++

  1. // SignalProcess.cpp : Defines the entry point for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. #include "SignalProcess.h"
  5. BOOL APIENTRY DllMain( HANDLE hModule, 
  6.                        DWORD  ul_reason_for_call, 
  7.                        LPVOID lpReserved
  8.  )
  9. {
  10.     return TRUE;
  11. }
  12. /*-----------------------------------------------  
  13.            FFT函数
  14.     data:指向数据序列地指针
  15. a   :指向data的DFT序列的指针
  16. L   :2的L次方为FFT的点数
  17. --------------------------------------------------*/
  18. int fft(int *data,complex <double> *a,int L)
  19. {
  20. complex <double> u;
  21. complex <double> w;
  22. complex <double> t;
  23. unsigned n=1,nv2,nm1,k,le,lei,ip;
  24. int i,j,m,number;
  25. double tmp;
  26. n<<=L;
  27. for(number = 0; number<n; number++)
  28. {
  29. a[number] = complex <double> (data[number],0);
  30. }
  31. nv2=n>>1;
  32. nm1=n-1;
  33. j=0;
  34. for(i=0;i<nm1;i++)
  35. {
  36. if(i<j)
  37. {
  38. t=a[j];
  39. a[j]=a[i];
  40. a[i]=t;
  41. }
  42. k=nv2;
  43. while(k<=j)
  44. {
  45. j-=k;
  46. k>>=1;
  47. }
  48. j+=k;
  49. }
  50. le=1;
  51. for(m=1;m<=L;m++)
  52. {
  53. lei=le;
  54. le<<=1;
  55. u=complex<double>(1,0);
  56. tmp=PI/lei;
  57. w=complex<double>(cos(tmp),-sin(tmp));
  58. for(j=0;j<lei;j++)
  59. {
  60. for(i=j;i<n;i+=le)
  61. {
  62. ip=i+lei;
  63. t=a[ip]*u;
  64. a[ip]=a[i]-t;
  65. a[i]+=t;
  66. }
  67. u*=w;
  68. }
  69. }
  70. return 0;
  71. }
  72. /*-----------------------------------------------  
  73.            IFFT函数
  74.     data:指向数据序列地指针
  75. a   :指向data的DFT序列的指针
  76. L   :2的L次方为FFT的点数
  77. --------------------------------------------------*/
  78. int ifft(complex <double> *a,int *data,int L)
  79. {
  80. complex <double> u;
  81. complex <double> w;
  82. complex <double> t;
  83. unsigned n=1,nv2,nm1,k,le,lei,ip;
  84. int i,j,m,number;
  85. double tmp;
  86. n<<=L;
  87. nv2=n>>1;
  88. nm1=n-1;
  89. j=0;
  90. for(i=0;i<nm1;i++)
  91. {
  92. if(i<j)
  93. {
  94. t=a[j];
  95. a[j]=a[i];
  96. a[i]=t;
  97. }
  98. k=nv2;
  99. while(k<=j)
  100. {
  101. j-=k;
  102. k>>=1;
  103. }
  104. j+=k;
  105. }
  106. le=1;
  107. for(m=1;m<=L;m++)
  108. {
  109. lei=le;
  110. le<<=1;
  111. u=complex<double>(1,0);
  112. tmp=PI/lei;
  113. w=complex<double>(cos(tmp),sin(tmp));
  114. for(j=0;j<lei;j++)
  115. {
  116. for(i=j;i<n;i+=le)
  117. {
  118. ip=i+lei;
  119. t=a[ip]*u;
  120. a[ip]=a[i]-t;
  121. a[i]+=t;
  122. }
  123. u*=w;
  124. }
  125. }
  126. for(number = 0; number<n; number++)
  127. {
  128. data[number] = ceil(a[number].real())/n;
  129. a[number] = a[number]/complex<double>(n,0);
  130. }
  131. return 0;
  132. }
  133. /*--------------------------------------------------------------
  134.                      Hilbert变换函数
  135. data:指向信号序列的指针
  136. filterdata:指向包络序列的指针
  137. dn:信号序列的点数
  138. ----------------------------------------------------------------*/
  139. int  __stdcall hilbert(int * data , int *filterdata,int dn)
  140. {
  141. int i = 0, j = 0, k = 0,l = 0,N = 0;
  142. complex<double> *zk;
  143. int *ldata;
  144. l = (int)(log(dn)/log(2))+1;
  145. N =(int) pow(2,l);
  146. zk = (complex<double>*)malloc(N*sizeof(complex<double>));
  147. ldata = (int *)malloc(N*sizeof(int));
  148. memcpy(ldata,data,dn*sizeof(int));
  149. for(i=dn;i<N;i++)
  150. {
  151. ldata[i] = 0;
  152. }
  153. fft(ldata,zk,l);
  154. for(i=0;i<N;i++)
  155. {
  156. if(i>=1 && i<=N/2-1)
  157. {
  158. zk[i] = complex<double>(2,0)*zk[i];
  159. }
  160. if(i>=N/2 && i<=N-1)
  161. {
  162. zk[i]= complex<double> (0,0);
  163. }
  164. }
  165. ifft(zk,ldata,l);
  166.     for(i = 0 ;i<dn;i++)
  167. {
  168. filterdata[i] = (int)sqrt(pow(zk[i].imag(),2)+pow(zk[i].real(),2));
  169. }
  170. free(zk);
  171. free(ldata);
  172. return 0;
  173. }
  174. int __stdcall conv(int *h,int *data,int *result,int hn,int dn)
  175. {
  176. int l,i,j,k,N;
  177. complex<double> *hk,*datak;
  178. l = (int)(log(hn+dn-1)/log(2))+1;
  179. N =(int) pow(2,l);
  180. int *lh,*ldata;
  181. lh =(int*)malloc(N*sizeof(int));
  182. ldata =(int*)malloc(N*sizeof(int));
  183. memcpy(lh,h,hn*sizeof(int));
  184. memcpy(ldata,data,dn*sizeof(int));
  185. for(i=hn;i<N;i++)
  186. {
  187. lh[i] = 0;
  188. }
  189. for(j=dn;j<N;j++)
  190. {
  191. ldata[j] = 0;
  192. }
  193.     hk = (complex <double> *) malloc(N*sizeof(complex<double>));
  194.     datak = (complex <double> *) malloc(N*sizeof(complex<double>));
  195. fft(lh,hk,l);
  196. fft(ldata,datak,l);
  197. for(k=0;k<N;k++)
  198. {
  199. datak[k] = datak[k]*hk[k];
  200. }
  201. ifft(datak,result,l);
  202. free(lh);
  203. free(ldata);
  204. free(hk);
  205. free(datak);
  206. return 0;
  207. }
  208. //////////////////////////////////////////////////////////////////
  209. int fft_f(double *data,complex <double> *a,int L)
  210. {
  211. complex <double> u;
  212. complex <double> w;
  213. complex <double> t;
  214. unsigned n=1,nv2,nm1,k,le,lei,ip;
  215. int i,j,m,number;
  216. double tmp;
  217. n<<=L;
  218. for(number = 0; number<n; number++)
  219. {
  220. a[number] = complex <double> (data[number],0);
  221. }
  222. nv2=n>>1;
  223. nm1=n-1;
  224. j=0;
  225. for(i=0;i<nm1;i++)
  226. {
  227. if(i<j)
  228. {
  229. t=a[j];
  230. a[j]=a[i];
  231. a[i]=t;
  232. }
  233. k=nv2;
  234. while(k<=j)
  235. {
  236. j-=k;
  237. k>>=1;
  238. }
  239. j+=k;
  240. }
  241. le=1;
  242. for(m=1;m<=L;m++)
  243. {
  244. lei=le;
  245. le<<=1;
  246. u=complex<double>(1,0);
  247. tmp=PI/lei;
  248. w=complex<double>(cos(tmp),-sin(tmp));
  249. for(j=0;j<lei;j++)
  250. {
  251. for(i=j;i<n;i+=le)
  252. {
  253. ip=i+lei;
  254. t=a[ip]*u;
  255. a[ip]=a[i]-t;
  256. a[i]+=t;
  257. }
  258. u*=w;
  259. }
  260. }
  261. return 0;
  262. }
  263. int conv_f(double *h,int *data,int *result,int hn,int dn)
  264. {
  265. int l,i,j,k,N;
  266. complex<double> *hk,*datak;
  267. l = (int)(log(hn+dn-1)/log(2))+1;
  268. N =(int) pow(2,l);
  269. int *ldata;
  270. double *lh;
  271. lh =(double*)malloc(N*sizeof(double));
  272. ldata =(int*)malloc(N*sizeof(int));
  273. memcpy(lh,h,hn*sizeof(double));
  274. memcpy(ldata,data,dn*sizeof(int));
  275. for(i=hn;i<N;i++)
  276. {
  277. lh[i] = 0;
  278. }
  279. for(j=dn;j<N;j++)
  280. {
  281. ldata[j] = 0;
  282. }
  283.     hk = (complex <double> *) malloc(N*sizeof(complex<double>));
  284.     datak = (complex <double> *) malloc(N*sizeof(complex<double>));
  285. fft_f(lh,hk,l);
  286. fft(ldata,datak,l);
  287. for(k=0;k<N;k++)
  288. {
  289. datak[k] = datak[k]*hk[k];
  290. }
  291. ifft(datak,result,l);
  292. free(lh);
  293. free(ldata);
  294. free(hk);
  295. free(datak);
  296. return 0;
  297. }
  298. /*int __stdcall firwin_e(int n,int band,int fl,int fh,int fs,int wn,int *h)
  299. {
  300. int i,n2,mid;
  301. double s,wc1,wc2,beta,delay;
  302. beta=0.0;
  303. double fln = (double)fl / fs;
  304. double fhn = (double)fh / fs;
  305. // if(wn==7)
  306. // {
  307. // printf("input beta parameter of Kaiser window(3<beta<10)n");
  308. // scanf("%lf",&beta);
  309. // }
  310. beta = 6;
  311. if((n%2)==0)
  312. {
  313. n2=n/2-1;
  314. mid=1;
  315. }
  316. else
  317. {
  318. n2=n/2;
  319. mid=0;
  320. }
  321. delay=n/2.0;
  322. wc1=2.0*PI*fln;
  323. if(band>=3) wc2=2.0*PI*fhn;
  324. switch(band)
  325. {
  326. case 1://低通
  327. {
  328. for (i=0;i<=n2;i++)
  329. {
  330. s=i-delay;
  331. *(h+i)=(int)((sin(wc1*s)/(PI*s))*window(wn,n+1,i,beta));
  332. *(h+n-i)=*(h+i);
  333. }
  334. if(mid==1) *(h+n/2)=(int)(wc1/PI);
  335. break;
  336. }
  337. case 2: //高通
  338. {
  339. for (i=0;i<=n2;i++)
  340. {
  341. s=i-delay;
  342. *(h+i)=(int)((sin(PI*s)-sin(wc1*s))/(PI*s));
  343. *(h+i)=*(h+i)*(int)(window(wn,n+1,i,beta));
  344. *(h+n-i)=*(h+i);
  345. }
  346. if(mid==1) *(h+n/2)=(int)(1.0-wc1/PI);
  347. break;
  348. }
  349. case 3: //带通
  350. {
  351. for (i=0;i<=n2;i++)
  352. {
  353. s=i-delay;
  354. *(h+i)=(int)((sin(wc2*s)-sin(wc1*s))/(PI*s));
  355. *(h+i)=*(h+i)*(int)(window(wn,n+1,i,beta));
  356. *(h+n-i)=*(h+i);
  357. }
  358. if(mid==1) *(h+n/2)=(int)((wc2-wc1)/PI);
  359. break;
  360. }
  361. case 4: //带阻
  362. {
  363. for (i=0;i<=n2;i++)
  364. {
  365. s=i-delay;
  366. *(h+i)=(int)((sin(wc1*s)+sin(PI*s)-sin(wc2*s))/(PI*s));
  367. *(h+i)=*(h+i)*(int)(window(wn,n+1,i,beta));
  368. *(h+n-i)=*(h+i);
  369. }
  370. if(mid==1) *(h+n/2)=(int)((wc1+PI-wc2)/PI);
  371. break;
  372. }
  373. }
  374. return 0;
  375. }*/
  376. double window(int type,int n,int i,double beta)
  377. {
  378. int k;
  379. double w=1.0;
  380. switch(type)
  381. {
  382. case 1:
  383. {
  384. w=1.0;
  385. break;
  386. }
  387. case 2:
  388. {
  389. k=(n-2)/10;
  390. if(i<=k) w=0.5*(1.0-cos(i*PI/(k+1)));
  391. if(i>n-k-2) w=0.5*(1.0-cos((n-i-1)*PI/(k+1)));
  392. break;
  393. }
  394. case 3:
  395. {
  396. w=1.0-fabs(1.0-2*i/(n-1.0));
  397. break;
  398. }
  399. case 4:
  400. {
  401. w=0.5*(1.0-cos(2*i*PI/(n-1)));
  402. break;
  403. }
  404. case 5:
  405. {
  406. w=0.54-0.46*cos(2*i*PI/(n-1));
  407. break;
  408. }
  409. case 6:
  410. {
  411. w=0.42-0.5*cos(2*i*PI/(n-1))+0.08*cos(4*i*PI/(n-1));
  412. break;
  413. }
  414. case 7:
  415. {
  416. w=kaiser(i,n,beta);
  417. break;
  418. }
  419. }
  420. return(w);
  421. }
  422. double kaiser(int i,int n,double beta)
  423. {
  424. double a,w,a2,b1,b2,beta1;
  425. b1=bessel0(beta);
  426. a=2.0*i/(double)(n-1)-1.0;
  427. a2=a*a;
  428. beta1=beta*sqrt(1.0-a2);
  429. b2=bessel0(beta1);
  430. w=b2/b1;
  431. return(w);
  432. }
  433. double bessel0(double x)
  434. {
  435. int i;
  436. double d,y,d2,sum;
  437. y=x/2.0;
  438. d=1.0;
  439. for(i=1;i<=25;i++)
  440. {
  441. d=d*y/i;
  442. d2=d*d;
  443. sum=sum+d2;
  444. if(d2<sum*(1.0e-8)) break;
  445. }
  446. return(sum);
  447. }
  448. int __stdcall firwin_e(int n,int band,int fl,int fh,int fs,int wn, int *data,int *result,int dn)
  449. {
  450. int i,n2,mid;
  451. double *h;
  452. double s,wc1,wc2,beta,delay;
  453. beta=0.0;
  454. double fln = (double)fl / fs;
  455. double fhn = (double)fh / fs;
  456. // if(wn==7)
  457. // {
  458. // printf("input beta parameter of Kaiser window(3<beta<10)n");
  459. // scanf("%lf",&beta);
  460. // }
  461. h = (double *)malloc((n+1)*sizeof(double));
  462. beta = 6;
  463. if((n%2)==0)
  464. {
  465. n2=n/2-1;
  466. mid=1;
  467. }
  468. else
  469. {
  470. n2=n/2;
  471. mid=0;
  472. }
  473. delay=n/2.0;
  474. wc1=2.0*PI*fln;
  475. // FILE *fp;
  476. if(band>=3) wc2=2.0*PI*fhn;
  477. switch(band)
  478. {
  479. case 1://低通
  480. {
  481. for (i=0;i<=n2;i++)
  482. {
  483. s=i-delay;
  484. *(h+i)=(sin(wc1*s)/(PI*s))*window(wn,n+1,i,beta);
  485. *(h+n-i)=*(h+i);
  486. }
  487. if(mid==1) *(h+n/2)=wc1/PI;
  488. break;
  489. }
  490. case 2: //高通
  491. {
  492. for (i=0;i<=n2;i++)
  493. {
  494. s=i-delay;
  495. *(h+i)=(sin(PI*s)-sin(wc1*s))/(PI*s);
  496. *(h+i)=*(h+i)*window(wn,n+1,i,beta);
  497. *(h+n-i)=*(h+i);
  498. }
  499. if(mid==1) *(h+n/2)=1.0-wc1/PI;
  500. break;
  501. }
  502. case 3: //带通
  503. {
  504. for (i=0;i<=n2;i++)
  505. {
  506. s=i-delay;
  507. *(h+i)=(sin(wc2*s)-sin(wc1*s))/(PI*s);
  508. *(h+i)=*(h+i)*window(wn,n+1,i,beta);
  509. *(h+n-i)=*(h+i);
  510. }
  511. if(mid==1) *(h+n/2)=(wc2-wc1)/PI;
  512. break;
  513. }
  514. case 4: //带阻
  515. {
  516. for (i=0;i<=n2;i++)
  517. {
  518. s=i-delay;
  519. *(h+i)=(sin(wc1*s)+sin(PI*s)-sin(wc2*s))/(PI*s);
  520. *(h+i)=*(h+i)*window(wn,n+1,i,beta);
  521. *(h+n-i)=*(h+i);
  522. }
  523. if(mid==1) *(h+n/2)=(wc1+PI-wc2)/PI;
  524. break;
  525. }
  526. }
  527. // fp=fopen("h.dat","w");
  528. // for(int p= 0;p<n+1;p++)
  529. // {
  530. // fprintf(fp, "%fn", h[p]);
  531. // }
  532. // fclose(fp);
  533. conv_f(h,data,result,n+1,dn);
  534. free(h);
  535. return 0;
  536. }