Сигнали и системи/Други домаћи 2020

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Поставка

Уз други домаћи задатак били су дати следећи фајлови:

Упутство

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)