För att kunna sända chirpsignaler kan det vara lämpligt att skapa en wav fil i python. Jag har valt en signal på tre sekunder. Den består av trettio glada chirpar på 2mS och tyst i luren i 98 mS. Jag klipper in de olika avsnitten var för sig.
import numpy as np
import wave, struct, math
from scipy.signal import chirp
import Visa_Bild
import Read_File
dt = np.dtype(’<i2’)
# maxVol=2**15-1.0 #maximum amplitude # min=-32768 max=32767 Har bara skrivit in den här raden för att komma ihåg gränsvärdena.
Den här funktionen återkommer i rätt många sammanhang:
def timeSeries(sampleRate, t_start, t_stopp):
’Returns a time series based on sampleRate, starttid och stopptid’
Tid_Intervall = 1./sampleRate
timeSeries = np.arange(t_start, t_stopp, Tid_Intervall)
return timeSeries
Sedan kommer ett antal variabler. Poängen ar att variabeln t_stopp2 motsvarar stora T i chirpen.
file_name = ’chirp2_5_15kHz.wav’
print(’file_name ’, file_name)
sampleRate = 264600
t_start = 0 # the starting time (e.g. second 0)
t_stopp1 = 0.098
t_stopp2 = 0.002
time1 = timeSeries(sampleRate, t_start, t_stopp1)
print(’timeSeries 1 ’, len(time1))
time2 = timeSeries(sampleRate, t_start, t_stopp2)
print(’timeSeries 2 ’, len(time2))
amplitud_1 = 0.001
amplitud_2 = 1
f0 = 5000 # Start för svepet
f1 = 15000 # Ändläge för svepet
Sedan kör jag igång min wav fil. Väldigt bra att använda mono annars blir det rätt konstigt.
obj = wave.open(file_name, ’wb’)
obj.setnchannels(1) # mono
#obj.setnchannels(2) # stereo
obj.setsampwidth(2)
obj.setframerate(sampleRate)
Sedan loopar jag ihop min chirp med tystnaden. Åtminstone tror jag det är tystnad, blev less och skrev value = 1 och det blev tyst.
b=0
while b< 30:
#for c in range(0, len(y)):
for t in time2:
# linear, quadratic, logarithmic, hyperbolic
value = math.floor(32767*amplitud_2*chirp(t, f0, t_stopp2, f1, method=’linear’))
data = struct.pack(’<h’, value)
obj.writeframesraw( data )
for i in time1:
value = 1
data = struct.pack(’<h’, value)
obj.writeframesraw( data )
b=b+1
obj.close()
Nu är signalen sparad och klar att användas. Fast först kollar jag upp den. Jag börjar med att läsa in min wav-fil, sedan måste jag av någon anledning påminna wavfilen att den är rätt typ. Först visar jag hela signalen 3 sekunder, och sedan chirpen på 2 mS
x = []
x, sampleRate = Read_File.Read_fil(file_name)
x = np.asarray(x, dtype=np.int16)
Visa_Bild.Visa_fil(x)
x = x[0:len(time2)]
Visa_Bild.Visa_fil(x)
Sedan kör jag en DFT , hämtar mitt N och tar reda på var jag hittar start och stopp frekvensen.
signal = Visa_Bild.DFT(x)
x_normed = (signal – signal.min(0)) / signal.ptp(0) #normaliseras till 1 – -1
x1 = signal
N = x1.size
print(’N ’, N)
k_f0 = int((f0*N)/sampleRate)
k_f1 = int((f1*N)/sampleRate)
print(’k_f0 ’, k_f0, ’k_f1 ’, k_f1)
Jag loopar ut vinkeln och realdelen, skall räta upp den delen så småningom, lite otydligt att blanda real och angle, men det ordnar sig.
bredd = math.floor(N/2)
vinklar1 = []
real = []
for k in range(0, bredd):
v1 = round(float(np.angle(np.asarray(x1)[k],deg=False)),2)
a1 = round((np.real(np.asarray(x_normed)[k])), 2)
vinklar1.append(v1)
real.append(a1)
Så var det dags att titta på vad jag har i vinklarna
Visa_Bild.Visa_Kurva(range(0, bredd), vinklar1)
Och sist så har jag ett mix-mach från DFT:en.
y = vinklar1[k_f0:k_f1]
x = real[k_f0:k_f1]
Visa_Bild.Visa_Flera(x, y, k_f0, k_f1)
Det ser ju lite fattigt ut så jag påminner om hur en lite mer fullstäning signal kan se ut. Jag kör med samma samplerate, men använder startfrekvensen 50kHz och stoppfrekvensen 25kHz. bilderna liggger i samma sekvens, riktigt tjusigt.
Skulle vara roligt att köra på lite högre frekvens, men förstärkaren till min ultrasonic högtalare verkar inte komma. Men det gör inte så mycket. Skall försöka lära mig att analysera den här soppan först.