Ahora este el el script python para el resampleo. Tampoco es un formulón de la leche:
#! /usr/bin/env python
import math
import os
#definicion la funcion sinc
def sinc(x):
try:
return math.sin(x) / x
except ZeroDivisionError: # sinc(0) = 1
return 1.0
# Parte de script que muestrea un tono de frecuencia elegida
# frecuencia angular de la onda a muestrear
w = math.pi*freq
# frecuencia de muestreo inicial (44.1 KHz)
sampl1 = 44100.
# frecuencia angular del filtro de Shannon
w1 = math.pi*sampl1
# numero de muestras a tomar
m1 = 100
# instante en que tomamos el primer muestreo.
ini_p = 0.06/freq
# frecuencia de remuestreo. Multiplo de la frecuencia de muestreo
sampl2 = sampl1 * 10
# numero de muestras en remuestreo. Son sampl2/sampl1 veces mas
m2 = m1 *int(sampl2 /sampl1)
# Ventana del filtro (terminos del sumatorio de "Shannon")
ventana1 = 10
# ventana en remuestreo
ventana2 = ventana1 *int(sampl2 /sampl1)
# lista donde anadir los puntos del remuestreo en pares (tiempo, amplitud)
remuestra = []
#Leo el fichero con la onda
f = open('onda.dat','r')
# muestra es la lista con las muestras leidas a pares tiempo, amplitud
muestra = []
for line in f.readlines():
muestra.append([float(line[:line.find(' ',2)]),float(line[line.find(' ',2)+1:])])
# En el fichero resample.dat tengo el resampleo de la onda
f2 = open('resample.dat','w')
# Insertar ceros para manejarme con la ventana
for i in range(0,ventana2):
tiempo = ini_p+(-ventana2*2+i)/sampl2
remuestra.append([tiempo,0.0])
f2.write(str(tiempo)+' '+ str(0.0)+'\n')
#Remuestreo con el teorema de Shannon
for j in range(ventana,len(muestra)-ventana1):
for k in range(0,int(sampl2/sampl1)):
tiempo = muestra[j][0]+k/sampl2
valor = 0
for h in range(int(j-ventana1),int(j+ventana1)):
valor = valor + muestra[h][1]*sinc(w1*(tiempo-muestra[h][0]))
remuestra.append([tiempo,valor])
f2.write(str(tiempo)+' '+ str(valor)+'\n')
f2.close()
LO copiais lo salvais como resampleo.py y al ejecutarlo os saca la onda resampleada a partir de onda.dat. A partir de una onda aserrada saco el tono a 22 KHz muestreado a 10 veces los 44.100 Hz y sale algo asi:
¿Es magia? ¿Es trampa? ¿No pasa por los puntos? ¿Hacen falta mil ingenieros para reconstruir correctamente un tono a 22 KHz a partir de un muestreo al doble de frecuencia?
La única distorsión que hay, que es dificil de ver es la del número de términos que tomo, en vez de infinitos o "muchos", solo tomo 10 a cada lado del punto a remuestrear.