Сигнали и системи/Други домаћи 2020
Пређи на навигацију
Пређи на претрагу
Поставка
Уз други домаћи задатак били су дати следећи фајлови:
- поставка
- упутство
- аудио фајл
y_1.wav - аудио фајл
y_2.wav - Python код уз упутство, који следи:
Упутство
import numpy as np
import matplotlib.pyplot as plt
import scipy.signal as sci
from scipy.fftpack import fft, fftshift, fftfreq
from scipy.io import wavfile
#%% Učitavanje fajla
fs, x = wavfile.read('sissi_1.wav')
#%% Generisanje vremenske i frekvencijske ose
t_osa = np.arange(0, len(x)/fs, 1/fs)
f_osa = fftshift(fftfreq(len(x), 1/fs))
#%% Projektovanje filtra i filtriranje signala
f_gr = 3000
n = 6
[b, a] = sci.butter(n, f_gr/(fs/2), btype='lowpass')
xf = sci.filtfilt(b, a, x)
#%% Zapisivanje u .wav fajl
x_scaled = np.int16(xf/np.max(np.abs(xf)) * 32767)
wavfile.write('sissi_1_filtrirano.wav', fs, x_scaled)
#%% Furijeova transformacija
X_fft = fft(x)
Xa = np.abs(X_fft)
plt.figure()
plt.subplot(2,1,1)
plt.plot(t_osa, xf)
plt.subplot(2,1,2)
plt.plot(f_osa, fftshift(X_fft))
plt.show()
Решење
Уз решење у виду Python кода су се предавали горенаведени фајлови као и извештај.
Код
import numpy as np
import numpy as np
import matplotlib.pyplot as plt
import scipy.signal as sci
from scipy.fftpack import fft, fftshift, fftfreq
from scipy.io import wavfile
from matplotlib.backends.backend_pdf import PdfPages
# Pomoćna funkcija za ispis u WAV fajl
def writeWAV(filename, sr, sig):
wavfile.write(filename, sr, np.int16(sig / np.max(np.abs(sig)) * 32767))
# Funkcija koja signal sig sa frek. odabiranja sr provlači kroz lowpass filter reda order i granične frekvencije freq
def lowpass(order, sr, freq, sig):
b, a = sci.butter(order, freq/(sr/2))
return sci.filtfilt(b,a,sig)
# Funkcija koja signal sig sa frek. odabiranja sr provlači kroz bandpass filter reda order i graničnih frekvencija f1 i f2
def bandpass(order, sr, f1, f2, sig):
b, a = sci.butter(order, np.array( ( f1/(sr/2) , f2/(sr/2) ) ) ,btype='bandpass')
return sci.filtfilt(b,a,sig)
# Pomoćna funkcija koja za signal sig sa frek. odabiranja sr generiše amplitudsku karakteristiku i spektar u granicama xlim1 i xlim2
# i čuva u fajl imena filename
def graphFreq(sig, sr, filename, xlim1, xlim2):
f = fftshift(fftfreq(len(sig), 1/sr))
plt.figure(figsize=(10,5))
plt.xlim(xlim1,xlim2)
plt.plot(f, fftshift(np.abs(fft(sig))))
plt.savefig(filename)
plt.close()
def graphWave(sig, sr, filename):
t = np.arange(0, len(sig)/sr, 1/sr)
plt.figure()
plt.plot(t, sig)
plt.savefig(filename)
plt.close()
# Konstante
freqChannel = 18000
freqLP1 = 4000
freqLP2 = 6000
freqCarrier = 10000
freqBP_l = freqCarrier - freqLP2
freqBP_h = freqCarrier + freqLP2
# Učitavanje fajla
sampleRate1, y1 = wavfile.read('y_1.wav')
sampleRate2, y2 = wavfile.read('y_2.wav')
# Ulazno filtriranje
y1f = lowpass(10, sampleRate1, freqLP1, y1)
y2f = lowpass(10, sampleRate1, freqLP2, y2)
# Modulacija
t = np.linspace(0, len(y2f)/sampleRate2, num=len(y2f) )
y2m = y2f * np.cos(2*np.pi*freqCarrier*t)
# Spajanje
yt = y1f + y2m
# Prolaz kroz kanal
yr = lowpass(5, sampleRate1, freqChannel, yt)
# Odvajanje
y1r = lowpass(10, sampleRate1, freqLP1, yr)
y2b = bandpass(10, sampleRate1, freqBP_l,freqBP_h, yr)
y2d = y2b * np.cos(2*np.pi*freqCarrier*t)
y2r = lowpass(10, sampleRate1, freqLP2, y2d)
# Generisanje grafika i audio fajlova
signali = [y1, y2, y1f, y2f, y2m, yt, yr, y2b, y2d,y1r, y2r]
ime = ['y1','y2', 'y1f', 'y2f', 'y2m', 'yt', 'yr','y2b', 'y2d','y1r', 'y2r']
for i, sig in enumerate(signali):
graphFreq(sig, sampleRate1, ime[i]+'.pdf', -sampleRate1/2,sampleRate1/2)
graphWave(sig, sampleRate1, ime[i]+'-w.pdf')
if (i > 2): writeWAV(ime[i]+'.wav', sampleRate1, sig)