Get your own free workspace
View
 

CodeSincInterpolation

Page history last edited by PBworks 5 years, 6 months ago
到上一層

 


// in : 輸入訊號
// out : 重新取樣後的訊號
// NN1 : 輸入訊號 in 的長度
// NN2 : 重新取樣後訊號 out 的長度
// dT1 : in 的取樣間隔
// dT2 : 新取樣間隔
// dB : sinc 的頻寬
template<typename Type1, typename Type2>
Type1 * sinc_interpolation(Type1 * in, int NN1, double dT1, double dT2, Type2 * pNN2 = 0)
{
	// 計算增加取樣後的取樣點數
	int NN2 = Chinson::RoundOff(static_cast<double>(NN1 - 1) * dT1 / dT2) + 1;
	if(pNN2) (*pNN2) = NN2;

	// 計算 sinc 頻寬
	double dB = 1.0 / (2 * dT1);

	Type1 * out = new Type1[NN2];
	memset(out, 0, sizeof(Type1) * NN2);
	int k1, k2;
	// 以 dT 取樣間隔的取樣點 與 sinc 做 convolution ,再重新取樣得到 dT2 間隔的取樣點
	for(k2 = 0; k2 < NN2; k2++)
	{	
		for(k1 = 0; k1 < NN1; k1++)
		{
			out[k2] += in[k1] * sinc(2 * PI * dB * k2 * dT2 - k1 * PI);
		}
	}
	return out;
}

Comments (0)

You don't have permission to comment on this page.