grd.c
来自「Time-Frequency Toolbox,其中包含很常用的MATLAB程序」· C语言 代码 · 共 458 行 · 第 1/2 页
C
458 行
taumax = MIN (taumax, (tfr.N_freq / 2 - 1)); taumax = MIN (taumax, half_WindowF_Length); /* initialization of the first local autocorrelation function */ if (Signal.is_complex == TRUE) { lacf_real[0] = Signal.real_part[time] * Signal.real_part[time] + Signal.imag_part[time] * Signal.imag_part[time]; /* the imag part is always zero because the imag part of any complex 'x * conjugate(x)' is zero */ lacf_imag[0] = 0.0 ; } else /* the signal is real-valued */ { lacf_real[0] = Signal.real_part[time] * Signal.real_part[time]; lacf_imag[0] = 0.0; } /* The signal is windowed around the current time */ for (tau = 1; tau <= taumax; tau++) { R1_real = 0.0; R2_real = 0.0; R1_imag = 0.0; R2_imag = 0.0; /* bound of mu in order to take into account the edges */ mumin = MIN (half_WindowT_Length, (Signal.length-time-1-tau)); mumax = MIN (half_WindowT_Length, time - tau); normK = 0.0; for (mu = -mumin; mu <= mumax; mu++) { normK = normK + GRDKernel[idx (tau - 1, half_WindowT_Length + mu, MIN (tfr.N_freq / 2, half_WindowF_Length))]; } for (mu = -mumin; mu <= mumax; mu++) { /* case of complex valued signal */ if (Signal.is_complex == TRUE) { index = idx (tau - 1, half_WindowT_Length + mu, MIN (tfr.N_freq / 2, half_WindowF_Length)); R1_real = R1_real + (Signal.real_part[time + tau - mu] * Signal.real_part[time - tau - mu] + Signal.imag_part[time + tau - mu] * Signal.imag_part[time - tau - mu]) * GRDKernel[index]/ normK; R1_imag = R1_imag + (Signal.imag_part[time + tau - mu] * Signal.real_part[time - tau - mu] - Signal.real_part[time + tau - mu] * Signal.imag_part[time - tau - mu]) * GRDKernel[index] / normK; index = idx (tau - 1, half_WindowT_Length - mu, MIN(tfr.N_freq / 2, half_WindowF_Length)); R2_real = R2_real + (Signal.real_part[time - tau - mu] * Signal.real_part[time + tau - mu] + Signal.imag_part[time - tau - mu] * Signal.imag_part[time + tau - mu]) * GRDKernel[index] / normK; R2_imag = R2_imag + (Signal.imag_part[time - tau - mu] * Signal.real_part[time + tau - mu] - Signal.real_part[time - tau - mu] * Signal.imag_part[time + tau - mu]) * GRDKernel[index] / normK; } /* case of real-valued signal */ else { index = idx (tau - 1, half_WindowT_Length + mu, MIN (tfr.N_freq / 2, half_WindowF_Length)); R1_real = R1_real + (Signal.real_part[time + tau - mu] * Signal.real_part[time - tau - mu]) * GRDKernel[index] / normK; R1_imag = 0.0; index = idx (tau - 1, half_WindowT_Length - mu, MIN(tfr.N_freq / 2, half_WindowF_Length)); R2_real = R2_real + (Signal.real_part[time - tau - mu] * Signal.real_part[time + tau - mu]) * GRDKernel[index]/ normK; R2_imag = 0.0; } } lacf_real[tau] = R1_real * WindowF[half_WindowF_Length + tau]; lacf_imag[tau] = R1_imag * WindowF[half_WindowF_Length + tau]; lacf_real[tfr.N_freq - tau] = R2_real * WindowF[half_WindowF_Length - tau]; lacf_imag[tfr.N_freq - tau] = R2_imag * WindowF[half_WindowF_Length - tau]; } tau=floor(tfr.N_freq/2); if ((time<=Signal.length-tau-1)&(time>=tau)&(tau<=half_WindowF_Length)) { R1_real = 0.0; R2_real = 0.0; R1_imag = 0.0; R2_imag = 0.0; /* bound of mu in order to take into account the edges */ mumin = MIN (half_WindowT_Length, (Signal.length-time-1-tau)); mumax = MIN (half_WindowT_Length, time - tau); normK = 0.0; for (mu = -mumin; mu <= mumax; mu++) { normK = normK + GRDKernel[idx (tau - 1, half_WindowT_Length + mu, MIN (tfr.N_freq / 2, half_WindowF_Length))]; } for (mu = -mumin; mu <= mumax; mu++) { /* case of complex valued signal */ if (Signal.is_complex == TRUE) { index = idx (tau - 1, half_WindowT_Length + mu, MIN (tfr.N_freq / 2, half_WindowF_Length)); R1_real = R1_real + (Signal.real_part[time + tau - mu] * Signal.real_part[time - tau - mu] + Signal.imag_part[time + tau - mu] * Signal.imag_part[time - tau - mu]) * GRDKernel[index]/ normK; R1_imag = R1_imag + (Signal.imag_part[time + tau - mu] * Signal.real_part[time - tau - mu] - Signal.real_part[time + tau - mu] * Signal.imag_part[time - tau - mu]) * GRDKernel[index] / normK; index = idx (tau - 1, half_WindowT_Length - mu, MIN(tfr.N_freq / 2, half_WindowF_Length)); R2_real = R2_real + (Signal.real_part[time - tau - mu] * Signal.real_part[time + tau - mu] + Signal.imag_part[time - tau - mu] * Signal.imag_part[time + tau - mu]) * GRDKernel[index] / normK; R2_imag = R2_imag + (Signal.imag_part[time - tau - mu] * Signal.real_part[time + tau - mu] - Signal.real_part[time - tau - mu] * Signal.imag_part[time + tau - mu]) * GRDKernel[index] / normK; } /* case of real-valued signal */ else { index = idx (tau - 1, half_WindowT_Length + mu, MIN (tfr.N_freq / 2, half_WindowF_Length)); R1_real = R1_real + (Signal.real_part[time + tau - mu] * Signal.real_part[time - tau - mu]) * GRDKernel[index] / normK; R1_imag = 0.0; index = idx (tau - 1, half_WindowT_Length - mu, MIN(tfr.N_freq / 2, half_WindowF_Length)); R2_real = R2_real + (Signal.real_part[time - tau - mu] * Signal.real_part[time + tau - mu]) * GRDKernel[index]/ normK; R2_imag = 0.0; } } lacf_real[tau] = 0.5*( R1_real * WindowF[half_WindowF_Length + tau] + R2_real * WindowF[half_WindowF_Length - tau]); lacf_imag[tau] = 0.5*( R1_imag * WindowF[half_WindowF_Length + tau] + R2_imag * WindowF[half_WindowF_Length - tau]); } /* fft of the local autocorrelation function lacf */ fft (tfr.N_freq, Nfft, lacf_real, lacf_imag); /* the fft is put in the tfr matrix and the lacf is reinitialized */ for (row = 0; row < tfr.N_freq; row++) { tfr.real_part[idx (row, column, tfr.N_freq)] = lacf_real[row]; lacf_real[row] = 0.0; lacf_imag[row] = 0.0; } } /*--------------------------------------------------------------------------*/ /* free the memory used in this program */ /*--------------------------------------------------------------------------*/ FREE (lacf_real); FREE (lacf_imag); FREE (GRDKernel);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?