0

Pour une affectation universitaire, je dois interpoler certains points que j'avais précédemment échantillonnés à partir d'une onde. Cela fonctionne tant que je les interpole avec la fonction interp1.Utilisation de la fonction sinc pour l'interpolation

Mon professeur nous veut interpoler en utilisant la fonction sinc, donc je googlé et la documentation MathWorks dit que je devrais faire ceci:

rng default 

t = 1:10; 
x = randn(size(t))'; 
ts = linspace(-5,15,600); 
[Ts,T] = ndgrid(ts,t); 
y = sinc(Ts - T)*x; 

plot(t,x,'o',ts,y) 
xlabel Time, ylabel Signal 
legend('Sampled','Interpolated','Location','SouthWest') 
legend boxoff 

Il fonctionne, mais depuis que je dois interpoler les points qui sont un domaine réduit j'ai modifié le code pour essayer de interpoler points qui sont dans la gamme 0-1:

rng shuffle 

t = 0:0.1:1; 
x = randn(size(t))'; 
ts = linspace(-1,2,600); 
[Ts,T] = ndgrid(ts,t); 
y = sinc(Ts - T)*x; 

plot(t,x,'o',ts,y) 
xlabel Time, ylabel Signal 
legend('Sampled','Interpolated','Location','SouthWest') 
legend boxoff 

et il ne fonctionne pas correctement, je reçois ce de ce qui précède:

Figure

Pourriez-vous s'il vous plaît me dire ce que je fais mal, ou si sinc ne fonctionne que dans des domaines « grands »?

+0

Quel algorithme d'interpolation que vous voulez mettre en œuvre/utiliser? A quoi ressemble le résultat dans le "grand" domaine? – Svaberg

Répondre

4

Vous devez également faire évoluer votre fonction sinc dans le sens du temps pour adapter vos données:

dt = 0.1; 
y = sinc((Ts - T)/dt)*x; 

Explication

Parce que vous voulez interpoler entre votre point de données, vous devez vous assurer que la fonction d'interpolation (f) des autres points de données est égale à zéro au niveau du point de données actuelle:

f(k*dt) = 0 for all integers k != 0 

On sait que

sinc(k) = 0 for all integers k != 0 

Par conséquent, votre fonction d'interpolation doit être

f(t) = sinc(t/dt);