In [1]:
using PortAudio, SampledSignals, LibSndFile
using FileIO: load, save, loadstreaming, savestreaming
using QuadGK
In [2]:
PortAudio.devices()
Out[2]:
Nakon što ste pronašli vaše uređaje, možete otkomentirati sljedeću ćeliju u kojoj se ulaz s mikrofona direktno prenosi na zvučnik. Nakon toga treba ponovo pokrenuti jezgru.
In [3]:
#=
stream = PortAudioStream(2, 2)
try
# cancel with Ctrl-C
write(stream, stream)
finally
close(stream)
end
=#
Ukoliko želite snimiti svoj tekst, zamijenite mikrofon i izlaz s vašim uređajima, i izvedite sljedeće četiri čelije.
In [6]:
# stream = PortAudioStream("Microphone (BRIO 4K Stream Edit","Microsoft Sound Mapper - Output")
Out[6]:
In [7]:
# Namjestite duljinu snimke (nemojte pretjerivati)
# buf = read(stream, 2s)
Out[7]:
In [8]:
# Zatvorite stream
# close(stream)
In [9]:
# Spremite vašu snimku
# save("myvoice.wav", buf)
In [4]:
glas=load("myvoice.wav")
Out[4]:
In [5]:
length(glas)
Out[5]:
In [6]:
glas.samplerate
Out[6]:
In [7]:
typeof(glas)
Out[7]:
In [8]:
# Napravimo mono snimku
glas_mono=similar(glas)
Out[8]:
In [9]:
glas_mono.data=sum(glas.data,dims=2)
glas_mono.samplerate=glas.samplerate
Out[9]:
In [10]:
save("myvoice_mono.wav", glas_mono)
In [11]:
glas_mono.data
Out[11]:
In [12]:
# Pogledajmo signal
using Plots
In [14]:
S=glas_mono.data
plot(S)
Out[14]:
In [103]:
plot(T,S)
Out[103]:
In [18]:
# Trapezna formula, približno. Računamo kosinusni i sinusni spektar
using LinearAlgebra
A(λ::Float64)=(cos.(λ*T)⋅S)*((T[end]-T[1])/(length(T)*π))
B(λ::Float64)=(sin.(λ*T)⋅S)*((T[end]-T[1])/(length(T)*π))
Out[18]:
In [19]:
# Nacrtajmo kosinusni spektar i odlučimo gdje koje frekvencije ćemo zadržati
plot(B,300,5000)
Out[19]:
In [20]:
# Ograničimo spektar, opet koristimo približnu formulu
λ₀=600.0
λ₁=4500.0
step=0.5
Λ=range(λ₀,λ₁,step=step)
# Ovo traje cca 1 minutu, ali se računa samo jednom
Aλ=A.(Λ)
Bλ=B.(Λ)
Out[20]:
In [167]:
g(x::Float64)=(Aλ⋅cos.(x*Λ)+Bλ⋅sin.(x*Λ))*step
Out[167]:
In [21]:
# Rekonstruirajmo signal s odrezanim frekvencijama
g(x::Float64)=(Aλ⋅cos.(x*Λ)+Bλ⋅sin.(x*Λ))*step
G=g.(T)
Out[21]:
In [22]:
# Usporedimo grafički
plot(T,[S G],layout=(2,1))
Out[22]:
In [23]:
# Spremimo signal s odrezanim frekvencijama i poslušajmo
glas_mono_odrezan=deepcopy(glas_mono)
glas_mono_odrezan.data[:,1]=map(Float32,G)
save("myvoice_odrezan.wav", glas_mono_odrezan)
In [24]:
glas_mono_odrezan
Out[24]: