// 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.