¡¡¡Venga tios!!!
Osciloscopio no tendreís. Pero un PC con excel.
No digo ya gnuplot para sacar gráficas guapis. Pero el excel.....
¿Alguién se anima a ponerle errores de redondeo?
¿Y jitter?
¿Y a restar al resampling la función seno y pintar el error? Eso es la distorsión?
¿Efecto de disminuir la ventana?
¿Cambiar parámetros hasta que salgan aberraciones?
Por cierto, cuidado con los multiespacios del script. La marca de bloque (if, bucle,...) en python se hace por inserción de tabuladores. Y python tiene un editor que se llama idle y marca las palabras con "colorines".
El script con las dos partes al completo:
#! /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
# Ancho de banda en Hz
bw=20000
# frecuencia de la onda a muestrear
freq = 1.1025*bw
# 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 muestreo en pares (tiempo, amplitud)
muestra = []
# lista donde anadir los puntos del remuestreo en pares (tiempo, amplitud)
remuestra = []
# fichero de salida con el muestreo de la onda de prueba sin error de cuantizacion
# se llama onda.dat
f = open('onda.dat','w')
# anadir ceros que desplazan el muestreo. Retardo para poder "meter el filtro".
for i in range(0,ventana1*2):
tiempo = ini_p+(-ventana1*2+i)/sampl1
muestra.append([tiempo,0.0])
f.write(str(tiempo)+' '+ str(0.0)+'\n')
# Muestreo de la onda
for i in range(0,m1):
tiempo = ini_p + i/sampl1
valor = math.sin(w*tiempo)
muestra.append([tiempo,valor])
f.write(str(tiempo)+' '+ str(valor)+'\n')
f.close()
#Aqui comienza la fase de remuestreo
f2 = open('resample.dat','w')
print ventana2/sampl2, ventana1/sampl1
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
for j in range(ventana1,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]))
valor_corr = math.sin(w*tiempo)
error = abs(valor-valor_corr)/abs(valor_corr)
print tiempo, valor, error
remuestra.append([tiempo,valor,valor_corr,error])
f2.write(str(tiempo)+' '+ str(valor)+' '+str(valor_corr)+'\n')
f2.close()
EDITO: ESTABAN MAL ALGUNAS VARIABLES DEL SCRIPT
OS PONGO EL CÁLCULO DEL ERROR.