ดังนั้นฉันจึงพยายามเขียน interpolator โดเมนความถี่ที่ zero-pads ตอบสนองความถี่ของสัญญาณและการแปลงผกผัน มีสองกรณีที่ฉันต้องจัดการกับ:
- การตอบสนองแบบยาว - ต้องแยกถังขยะเพราะมันไม่ชัดเจน ดังนั้นฉันจึงคัดลอกส่วนลบของสเปกตรัมและเพิ่มศูนย์ในระหว่าง
n*(interp-1)-1
- การตอบกลับที่มีความยาวแปลก ๆ - ไม่มีดังนั้นเพียงแยกความถี่บวก / ลบและแทรกศูนย์ระหว่างพวกเขา
n*(interp-1)
รหัสที่ทำให้เกิดช่องว่างภายในสามารถดูได้ที่นี่
// Copy negative frequency components to end of buffer and zero out middle
// inp - input buffer of complex floats
// n - transform size
// interp - interpolation amount
void zero_pad_freq(cfloat_t *inp, size_t n, size_t interp) {
if ((n % 2) == 0) {
memmove(inp + n*interp - n/2, inp + n/2, n/2*sizeof(cfloat_t));
memset (inp + n/2 + 1, 0, (n*(interp-1)-1)*sizeof(cfloat_t)); // Duplicate Fs/2 so we need one less zero
inp[n/2] /= 2.0;
inp[n*interp-n/2] /= 2.0;
} else {
memmove(inp + n*interp - n/2, inp + (n+1)/2, n/2*sizeof(cfloat_t));
memset (inp + (n+1)/2, 0, (n*(interp-1))*sizeof(cfloat_t));
}
}
กรณีแรกทำงานได้ดีฉันกำลังทดสอบสัญญาณ chirp และมันสอดแทรกได้ดีมีสัญญาณรบกวนเล็กน้อย แต่รอบดีดขึ้นเป็น FFT คุณสามารถทำอะไรได้ (แรกหรือมากกว่านั้น สัญญาณแสดง):
ปัญหาอยู่ที่การแปลงความยาวคี่ฉันได้รับการตอบสนองชั่วคราวชั่วร้ายสำหรับตัวอย่างจริงเท่านั้น (อีกครั้งจริง):
ช่องจินตภาพมีระลอกคลื่นเล็ก ๆ อยู่ แต่ไม่เกือบแย่:
มันเหมือนกับว่าฉันได้เมา bin ในกรณีแปลก ๆ แต่ไม่มี bin ดังนั้นฉันก็งงมาก ใครมีความคิดบ้างF s / 2