Vì vậy, tôi đang cố gắng viết một bộ nội suy miền tần số không đệm cho đáp ứng tần số của tín hiệu và các biến đổi nghịch đảo. Có hai trường hợp tôi phải giải quyết:
- Phản hồi có độ dài bằng nhau - phải chia thùng vì nó không rõ ràng. Vì vậy, tôi sao chép phần âm của phổ và thêm các số 0 ở giữa.
n*(interp-1)-1
- Đáp ứng độ dài lẻ - không có thùng nên chỉ cần phân chia tần số dương / âm và chèn các số 0 giữa chúng.
n*(interp-1)
Mã không đệm ở đây có thể được nhìn thấy ở đây
// 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));
}
}
Trường hợp đầu tiên được làm việc tốt, tôi đang thử nghiệm nó trên một tín hiệu chirp và nó nội suy tốt, có một chút tiếng ồn số, nhưng nó tròn vấp qua một FFT vì vậy những gì bạn có thể làm (lần đầu tiên hoặc lâu hơn của tín hiệu chỉ):
Kênh tưởng tượng có một gợn nhỏ trên đó, nhưng gần như không tệ: