void CFSKModem::SmoothingWave(short *InDataBuf,unsigned long length, unsigned long LowF, unsigned long HighF, unsigned long SampleRate) { unsigned long i, j, k, N; long start, end; unsigned long l, h; #if 0 for(i = 0; i < length;) { FindFrame(InDataBuf + i, length - i, &start, &end); if(start >= 0) { if(end == -1) end = length - i - 1; N = GetN(end - start + 512); // 前后各至少填充256点,每点值为0 memset(this->m_fPoint, 0, 2 * N * sizeof(float)); for (j = 256; j < N; j ++) { this->m_fPoint[2*j] = InDataBuf[i+start+j-256]; } /* Calculate FFT. */ cdft(N*2, -1, this->m_fPoint); /* Filter */ l = (unsigned long)(LowF/((float)SampleRate/N)); h = (unsigned long)(HighF/((float)SampleRate/N)); for(k = 0; k < l; k ++) { this->m_fPoint[2*k] = this->m_fPoint[2*k+1] = 0; } for(k = h; k < N; k ++) { this->m_fPoint[2*k] = this->m_fPoint[2*k+1] = 0; } /* Clear time-domain samples and calculate IFFT. */ memset(InDataBuf+i+start, 0, (end-start)*2); icdft(N*2, -1, this->m_fPoint); for(k = 0; k < end-start; k ++) { InDataBuf[i+start+k] = (short)this->m_fPoint[2*k+256]; } i += end; } else break; } #else for(i = 0; i < length;) { this->FindFrame(InDataBuf + i, length - i, &start, &end); if(start >= 0) { if(end == -1) end = length - i - 1; N = this->GetN(end - start + 512); // 前后各至少填充256点,每点值为0 memset(this->m_fPoint, 0, 2 * N * sizeof(float)); for (j = 256; j < end - start + 256; j ++) { this->m_fPoint[j] = InDataBuf[i+start+j-256]; } /* Calculate FFT. */ rdft(N, 1, this->m_fPoint); /* Filter */ l = (unsigned long)(LowF/((float)SampleRate/N)); h = (unsigned long)(HighF/((float)SampleRate/N)); for(k = 0; k < l; k ++) { this->m_fPoint[2*k] = this->m_fPoint[2*k+1] = 0; } for(k = h; k < N; k ++) { this->m_fPoint[2*k] = this->m_fPoint[2*k+1] = 0; } /* Clear time-domain samples and calculate IFFT. */ memset(InDataBuf+i+start, 0, (end-start)*2); rdft(N, -1, this->m_fPoint); for (j = 0; j <= N - 1; j++) { //this->m_fPoint[j] *= 2.0/ N; this->m_fPoint[j] /= N; } for(k = 0; k < end-start; k ++) { InDataBuf[i+start+k] = (short)this->m_fPoint[k+256]; } i += end; } else break; } #endif }
void CFSKModem::SmoothingWave(short *InDataBuf,unsigned long length, unsigned long LowF, unsigned long HighF, unsigned long SampleRate) { unsigned long i, j, k, N; long start, end; unsigned long l, h; /* unsigned long NumberOfLow = 0;//小幅度波的个数 for(;i<length;) { NumberOfLow = 0; while((InDataBuf[i] < 500)&&(InDataBuf[i] > -500)) //去除 连续 3点小于500的点 { i++; NumberOfLow++; if(i == length) { return; } } if(NumberOfLow < 3)//对于中间出现的小幅度波小于3,要退回去 { i -= NumberOfLow; } //InDataBuf[i] = (InDataBuf[i - 1] + InDataBuf[i] + InDataBuf[i + 1])/3; //i++; }*/ #if 0 for(i = 0; i < length;) { FindFrame(InDataBuf + i, length - i, &start, &end); if(start >= 0) { if(end == -1) end = length - i - 1; N = GetN(end - start + 512); // 前后各至少填充256点,每点值为0 memset(this->m_fPoint, 0, 2 * N * sizeof(float)); for (j = 256; j < N; j ++) { this->m_fPoint[2*j] = InDataBuf[i+start+j-256]; } /* Calculate FFT. */ cdft(N*2, -1, this->m_fPoint); /* Filter */ l = (unsigned long)(LowF/((float)SampleRate/N)); h = (unsigned long)(HighF/((float)SampleRate/N)); for(k = 0; k < l; k ++) { this->m_fPoint[2*k] = this->m_fPoint[2*k+1] = 0; } for(k = h; k < N; k ++) { this->m_fPoint[2*k] = this->m_fPoint[2*k+1] = 0; } /* Clear time-domain samples and calculate IFFT. */ memset(InDataBuf+i+start, 0, (end-start)*2); icdft(N*2, -1, this->m_fPoint); for(k = 0; k < end-start; k ++) { InDataBuf[i+start+k] = (short)this->m_fPoint[2*k+256]; } i += end; } else break; } #else for(i = 0; i < length;) { this->FindFrame(InDataBuf + i, length - i, &start, &end); if(start >= 0) { if(end == -1) end = length - i - 1; N = this->GetN(end - start + 512); // 前后各至少填充256点,每点值为0 memset(this->m_fPoint, 0, 2 * N * sizeof(float)); for (j = 256; j < end - start + 256; j ++) { this->m_fPoint[j] = InDataBuf[i+start+j-256]; } /* Calculate FFT. */ rdft(N, 1, this->m_fPoint); /* Filter */ l = (unsigned long)(LowF/((float)SampleRate/N)); h = (unsigned long)(HighF/((float)SampleRate/N)); for(k = 0; k < l; k ++) { this->m_fPoint[2*k] = this->m_fPoint[2*k+1] = 0; } for(k = h; k < N; k ++) { this->m_fPoint[2*k] = this->m_fPoint[2*k+1] = 0; } /* Clear time-domain samples and calculate IFFT. */ memset(InDataBuf+i+start, 0, (end-start)*2); rdft(N, -1, this->m_fPoint); for (j = 0; j <= N - 1; j++) { //this->m_fPoint[j] *= 2.0/ N; this->m_fPoint[j] /= N; } for(k = 0; k < end-start; k ++) { InDataBuf[i+start+k] = (short)this->m_fPoint[k+256]; } i += end; } else break; } #endif }
void SmoothingWave(short *InDataBuf,unsigned long length, unsigned long LowF, unsigned long HighF, unsigned long SampleRate) { unsigned long i, j, k, N; long start, end; unsigned long l, h; float *g_fPoint; /* pointer to time-domain samples */// 这个东西至今没有确切的了解是什么,先放着 g_fPoint = (float*)malloc(2 * MAX_N_POINTS * sizeof(float));//滤波的时候保存数据 #if 0 for(i = 0; i < length;) { FindFrame(InDataBuf + i, length - i, &start, &end); if(start >= 0) { if(end == -1) end = length - i - 1; N = GetN(end - start + 512); // 前后各至少填充256点,每点值为0 memset(m_fPoint, 0, 2 * N * sizeof(float)); for (j = 256; j < N; j ++) { m_fPoint[2*j] = InDataBuf[i+start+j-256]; } /* Calculate FFT. */ cdft(N*2, -1, m_fPoint); /* Filter */ l = (unsigned long)(LowF/((float)SampleRate/N)); h = (unsigned long)(HighF/((float)SampleRate/N)); for(k = 0; k < l; k ++) { m_fPoint[2*k] = m_fPoint[2*k+1] = 0; } for(k = h; k < N; k ++) { m_fPoint[2*k] = m_fPoint[2*k+1] = 0; } /* Clear time-domain samples and calculate IFFT. */ memset(InDataBuf+i+start, 0, (end-start)*2); icdft(N*2, -1, m_fPoint); for(k = 0; k < end-start; k ++) { InDataBuf[i+start+k] = (short)m_fPoint[2*k+256]; } i += end; } else break; } #else for(i = 0; i < length;) { FindFrame(InDataBuf + i, length - i, &start, &end); if(start >= 0) { if(end == -1) end = length - i - 1; N = GetN(end - start + 512); // 前后各至少填充256点,每点值为0 memset(g_fPoint, 0, 2 * N * sizeof(float)); for (j = 256; j < end - start + 256; j ++) { g_fPoint[j] = InDataBuf[i+start+j-256]; } /* Calculate FFT. */ rdft(N, 1, g_fPoint); /* Filter */ l = (unsigned long)(LowF/((float)SampleRate/N)); h = (unsigned long)(HighF/((float)SampleRate/N)); for(k = 0; k < l; k ++) { g_fPoint[2*k] = g_fPoint[2*k+1] = 0; } for(k = h; k < N; k ++) { g_fPoint[2*k] = g_fPoint[2*k+1] = 0; } /* Clear time-domain samples and calculate IFFT. */ memset(InDataBuf+i+start, 0, (end-start)*2); rdft(N, -1, g_fPoint); for (j = 0; j <= N - 1; j++) { //m_fPoint[j] *= 2.0/ N; g_fPoint[j] /= N; } for(k = 0; k < end-start; k ++) { InDataBuf[i+start+k] = (short)g_fPoint[k+256]; } i += end; } else { free(g_fPoint); break; } } free(g_fPoint); #endif }