Bu yüzden bir sinyalin frekans yanıtını ve ters dönüşümleri sıfırlayan bir frekans-etki alanı enterpolatörü yazmaya çalışıyorum. Ele almam gereken iki durum var:
- Eşit uzunluklu tepki - belirsiz olduğu için bölmesini bölmek zorundasınız . Bu yüzden spektrumun negatif kısmını kopyalarım ve arasına sıfırlar ekliyorum .
n*(interp-1)-1
- Tek uzunluk yanıtı - kutusu yoktur, bu yüzden pozitif / negatif frekansı bölün ve aralarına sıfır ekleyin .
n*(interp-1)
Sıfır dolgusu yapan kod burada görülebilir
// 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));
}
}
İlk durum iyi çalışıyor, bir cıvıltı sinyali üzerinde test ediyorum ve sadece iyi enterpolasyon yapıyor, biraz sayısal gürültü var, ama yuvarlak bir FFT aracılığıyla takıldı, böylece ne yapabilirsiniz (ilk veya benzeri) sinyal gösterisi):
Sorun tek uzunluk dönüşümü ile, sadece gerçek örnekler üzerinde oldukça heinous geçici bir yanıt alıyorum ( tekrar , gerçek):
Hayali kanalın üzerinde küçük bir dalgalanma var, ama neredeyse o kadar kötü değil:
Sanki garip durumda berbat ettim , ama kutusu yok, bu yüzden çok şaşkınım. Kimsenin düşüncesi var mı?F s / 2