J'essaie donc d'écrire un interpolateur dans le domaine fréquentiel qui met à zéro la réponse en fréquence d'un signal et les transformations inverses. Il y a deux cas que je dois traiter:
- Réponse de longueur égale - il faut diviser le bac car il est ambigu. Je copie donc la partie négative du spectre et ajoute des zéros entre les deux.
n*(interp-1)-1
- Réponse de longueur impaire - il n'y a pas de bac il suffit donc de diviser la fréquence positive / négative et d'insérer des zéros entre eux.
n*(interp-1)
Le code qui fait le zéro-padding peut être vu ici
// 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));
}
}
Le premier cas fonctionne bien, je teste sur un signal chirp et interpole très bien, il y a un peu de bruit numérique, mais il est rond déclenché par une FFT Que pouvez - vous faire (premier ou si du signal spectacle):
Le canal imaginaire a une petite ondulation, mais pas aussi mauvais:
fft
interpolation
c
gct
la source
la source
Réponses:
En mettant à zéro les bacs haute fréquence, vous avez effectivement multiplié le spectre du signal avec une fonction rectangulaire. La multiplication en fréquence est une convolution dans le temps et la paire de Fourier d'un rect est un sinc. Donc, ce que vous avez vraiment fait, c'est convoluer le signal du domaine temporel avec un sinc avec la largeur du lobe principal du sinc inversement proportionnelle à la longueur du rect. C'est pourquoi les nombreuses techniques de conception de filtres comme la conception de Parks-McClellan dans ce qu'on appelle une bande de "région de transition" ou de "transition" afin qu'il n'y ait pas de changement instantané de la réponse en fréquence du filtre. Ces techniques de conception de filtres sont importantes car le filtre "idéal" comme vous l'avez utilisé a de tels effets indésirables dans le domaine temporel.
la source
Une étape dans le domaine fréquentiel apparaîtra comme des ondulations dans le domaine temporel. Si vous lissez vos données de fréquence avec une fonction de fenêtre (par exemple une fenêtre de Hamming), cela devrait réduire considérablement les ondulations.
la source