声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2036|回复: 3

[C/C++] 哪位兄弟有c\c++的互相关的程序!!!

[复制链接]
发表于 2007-12-13 13:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
先谢谢了
回复
分享到:

使用道具 举报

发表于 2007-12-20 19:31 | 显示全部楼层
自己编写,不难的
发表于 2007-12-24 11:10 | 显示全部楼层
  1. #include <math.h>
  2. #define M_PI    3.14159265358979323846
  3. #define FALSE    0
  4. #define TRUE    1
  5. #define BIG    1e10
  6. #define SMALL    1e-10

  7. typedef struct {
  8.     float r, i;
  9. } complex;



  10. /* FAST CORRELATION OF X(0:L) AND Y(0:L).  FINDS RXY(0) THRU RXY(NMAX). */
  11. /* L=LAST INDEX IN BOTH X AND Y.  MUST BE (POWER OF 2)+1 AND AT LEAST 5. */
  12. /* ITYPE=TYPE OF CORRELATION=0 IF X AND Y ARE THE SAME VECTOR (AUTO- */
  13. /*         CORRELATION), OR NOT 0 IF X AND Y ARE DIFFERENT VECTORS. */
  14. /* NMAX=MAXIMUM LAG OF INTEREST IN THE CORRELATION FUNCTION. */
  15. /* FFT LENGTH ,N, USED INTERNALLY, IS L-1. */
  16. /* LET K=INDEX OF FIRST NONZERO SAMPLE IN Y(0)---Y(N-1).  THEN X(0) */
  17. /*  到 X(N-1) MUST INCLUDE PADDING OF AT LEAST NMAX-K ZEROS. */
  18. /* CORRELATION FUNCTION, RXY, REPLACES X(0) THRU X(NMAX). */
  19. /* Y(0) THRU Y(L) IS REPLACED BY ITS FFT, COMPUTED USING SPFFTR. */
  20. /* IERROR=0  NO ERROR DETECTED */
  21. /*        1  L-1 NOT A POWER OF 2 */
  22. /*        2  NMAX OUT OF RANGE */
  23. /*        3  INADEQUATE ZERO  */


  24. void spcorr(float *x, float *y, long *l, long *type, long *nmax, long *error)
  25. /*
  26. x:序列X;
  27. y:序列Y;
  28. l:序列X与序列Y的长度,不小5,且要为2的幂次方;
  29. type:相关的类型,0:表示X与Y序列相同,其它值:X与Y序列不相同
  30. nmax:相关的最大时延;
  31. error:运行出错提示;0:无错;1:数据长度不是2的幂次方;2:时延超界;3:无足够零填充出错
  32. */

  33. {
  34.      long j, k, m, n;//n:FFT长度;k:序列Y中的首个非零样本的位置序号;在序列Y中必须最少包含有(nmax-k)零填充。
  35.     complex cx;
  36.     float test;

  37.     n = *l - 1;
  38.     if (*nmax < 0 || *nmax >= n)
  39.     {
  40.     *error = 2;
  41.     return;
  42.     }

  43.     test = (float) n;
  44.     test /= 2.0;

  45.     while ((test - 2.0) > 0.0)
  46.     {
  47.     test /= 2.0;
  48.     }

  49.     if ((test - 2.0) == 0)
  50.     {
  51.     for (k = 0 ; k < n && y[k] == 0.0 ; ++k) ;

  52.     for (j = n - 1 ; j >= 0 && x[j] == 0.0 ; --j) ;

  53.     if ((n - 1 - j) < (*nmax - k))
  54.     {
  55.         *error = 3;
  56.         return;
  57.     }

  58.     spfftr(x, &n);//对X序列FFT变换
  59.     if (*type != 0)
  60.     {
  61.         spfftr(y, &n);//如果X、Y是相同序列,则对Y序列也进行FFT
  62.     }

  63.     for (m = 0 ; m <= (n / 2) ; ++m)
  64.     {
  65.         cx.r = x[m * 2] * y[m * 2] - -x[(m * 2) + 1] * y[(m * 2) + 1];
  66.         cx.i = x[m * 2] * y[(m * 2) + 1] + -x[(m * 2) + 1] * y[m * 2];

  67.         x[m * 2] = cx.r / n;
  68.         x[(m * 2) + 1] = cx.i / n;
  69.     }

  70.     spiftr(x, &n);

  71.     *error = 0;
  72.     }
  73.     else if ((test - 2.0) < 0.0)
  74.     {
  75.     *error = 1;
  76.     }

  77.     return;
  78. } /* spcorr */


  79. /* SPFFTR     11/12/85 */
  80. /* FFT ROUTINE FOR REAL TIME SERIES (X) WITH N=2**K SAMPLES. */
  81. /* COMPUTATION IS IN PLACE, OUTPUT REPLACES INPUT. */
  82. /* INPUT:  REAL VECTOR X(0:N+1) WITH REAL DATA SEQUENCE IN FIRST N */
  83. /*         ELEMENTS; ANYTHING IN LAST 2.  NOTE: X MAY BE DECLARED */
  84. /*         REAL IN MAIN PROGRAM PROVIDED THIS ROUTINE IS COMPILED  */
  85. /*         SEPARATELY ... COMPLEX OUTPUT REPLACES REAL INPUT HERE. */
  86. /* OUTPUT: COMPLEX VECTOR XX(O:N/2), SUCH THAT X(0)=REAL(XX(0)),X(1)= */
  87. /*         IMAG(XX(0)), X(2)=REAL(XX(1)), ..., X(N+1)=IMAG(XX(N/2). */
  88. /* IMPORTANT:  N MUST BE AT LEAST 4 AND MUST BE A POWER OF 2. */

  89. //FFT计算函数
  90. void spfftr(complex *x, long *n)
  91. {
  92.     /* Builtin functions */
  93.     void r_cnjg();

  94.     /* Local variables */
  95.     void spfftc();

  96.     long m, tmp_int;
  97.     complex u, tmp, tmp_complex;
  98.     float tpn, tmp_float;

  99.     tpn = (float) (2.0 * M_PI / (double) *n);

  100.     tmp_int = *n / 2;
  101.     spfftc(x, &tmp_int, &neg_i1);

  102.     x[*n / 2].r = x[0].r;
  103.     x[*n / 2].i = x[0].i;

  104.     for (m = 0 ; m <= (*n / 4) ; ++m)
  105.     {
  106.     u.r = (float) sin((double) m * tpn);
  107.     u.i = (float) cos((double) m * tpn);

  108.     r_cnjg(&tmp_complex, &x[*n / 2 - m]);

  109.     tmp.r = (((1.0 + u.r) * x[m].r - u.i * x[m].i)
  110.         + (1.0 - u.r) * tmp_complex.r - -u.i * tmp_complex.i) / 2.0;

  111.     tmp.i = (((1.0 + u.r) * x[m].i + u.i * x[m].r)
  112.         + (1.0 - u.r) * tmp_complex.i + -u.i * tmp_complex.r) / 2.0;

  113.     tmp_float = ((1.0 - u.r) * x[m].r - -u.i * x[m].i
  114.             + (1.0 + u.r) * tmp_complex.r - u.i * tmp_complex.i) / 2.0;
  115.     x[m].i = ((1.0 - u.r) * x[m].i + -u.i * x[m].r
  116.          + (1.0 + u.r) * tmp_complex.i + u.i * tmp_complex.r) / 2.0;
  117.     x[m].r = tmp_float;

  118.     r_cnjg(&x[*n / 2 - m], &tmp);
  119.     }

  120.     return;
  121. } /* spfftr */


  122. /* SPIFTR     02/20/87 */
  123. /* INVERSE FFT OF THE COMPLEX SPECTRUM OF A REAL TIME SERIES. */
  124. /* X AND N ARE THE SAME AS IN SPFFTR.  IMPORTANT: N MUST BE A POWER */
  125. /* OF 2 AND X MUST BE DIMENSIONED X(0:N+1) (REAL ARRAY, NOT COMPLEX). */
  126. /* THIS ROUTINE TRANSFORMS THE OUTPUT OF SPFFTR BACK INTO THE INPUT, */
  127. /* SCALED BY N.  COMPUTATION IS IN PLACE, AS IN SPFFTR. */

  128. //逆FFT变换函数
  129. void spiftr(complex *x, long *n)
  130. {
  131.     long m, tmp_int;
  132.     complex u, tmp_complex, tmp;
  133.     float tpn, tmp_float;

  134.     tpn = (float) (2.0 * M_PI / (double) *n);

  135.     for (m = 0 ; m <= (*n / 4) ; ++m)
  136.     {
  137.     u.r = (float) sin((double) m * tpn);
  138.     u.i = (float) -cos((double) m * tpn);

  139.     r_cnjg(&tmp_complex, &x[*n / 2 - m]);


  140.     tmp.r = ((1.0 + u.r) * x[m].r - u.i * x[m].i)
  141.         + ((1.0 - u.r) * tmp_complex.r - -u.i * tmp_complex.i);
  142.     tmp.i = ((1.0 + u.r) * x[m].i + u.i * x[m].r)
  143.         + ((1.0 - u.r) * tmp_complex.i + -u.i * tmp_complex.r);

  144.     r_cnjg(&tmp_complex, &x[*n / 2 - m]);

  145.     tmp_float = ((1.0 - u.r) * x[m].r - -u.i * x[m].i)
  146.             + ((1.0 + u.r) * tmp_complex.r - u.i * tmp_complex.i);
  147.     x[m].i = ((1.0 - u.r) * x[m].i + -u.i * x[m].r)
  148.         + ((1.0 + u.r) * tmp_complex.i + u.i * tmp_complex.r);

  149.     x[m].r = tmp_float;

  150.     r_cnjg(&x[*n / 2 - m], &tmp);
  151.     }
  152.     tmp_int = *n / 2;

  153.     spfftc(x, &tmp_int, &pos_i1);

  154.     return;
  155. } /* spiftr *



  156. void r_cnjg(complex *r, complex *z)
  157. {
  158.     r->r = z->r;
  159.     r->i = -z->i;
  160. }
复制代码
发表于 2008-6-3 11:03 | 显示全部楼层
很不错,谢了!!!!!!!!!!!!!11
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-23 23:56 , Processed in 0.058000 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表