247 lines
6.1 KiB
Text
247 lines
6.1 KiB
Text
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Analyse non paramétrique du signal de la flute\n",
|
|
"\n",
|
|
"Nous allons commencer par afficher le signals\n",
|
|
"\n",
|
|
"/TODO mettre des labels X/Y avec unités et des titres à toutes les figure"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"using WAV\n",
|
|
"\n",
|
|
"s, fs = wavread(\"../myson.wav\");\n",
|
|
"s = vec(s);\n",
|
|
"t = (0 : 1 : size(s)[1]-1)/fs;\n",
|
|
"fs = floor(Int, fs);\n",
|
|
"\n",
|
|
"t_s = 10 #s\n",
|
|
"trame_period = 0.005 #s\n",
|
|
"\n",
|
|
"floor_freq = 10 #Hz\n",
|
|
"ceil_freq = 60 #Hz\n",
|
|
"\n",
|
|
"number_trame = 50 # trames on each side of t_s\n",
|
|
"overlap = 0.0001;#s\n",
|
|
"\n",
|
|
"N_fft = 2^18- 1; #number points fft"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"using Plots\n",
|
|
"plot(t, s, title=\"Son bizarre\",label=[\"Signal\"])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Regardons des trames. La taille de trame reste classique : de l'ordre de 20ms.\n",
|
|
"\n",
|
|
"/TODO attention Gabor\n",
|
|
"\n",
|
|
"/TODO FFT avec gros nombre"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"#using LinearAlgebra\n",
|
|
"\n",
|
|
"#plot(t_trame, s_trame)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"using FFTW\n",
|
|
"\n",
|
|
"i_s = floor(Int, t_s*fs+1)\n",
|
|
"i_e = floor(Int, i_s+trame_period*fs)\n",
|
|
"t_trame = t[i_s:i_e]\n",
|
|
"s_trame = s[i_s:i_e]\n",
|
|
"\n",
|
|
"# Fourier Transform of it \n",
|
|
"s_pad = zeros(N_fft)\n",
|
|
"s_pad[1:size(s_trame,1), 1:size(s_trame,2)]=s_trame\n",
|
|
"F = fft(s_pad) |> fftshift\n",
|
|
"freqs = fftfreq(N_fft, fs) |> fftshift\n",
|
|
"\n",
|
|
"# plots \n",
|
|
"time_domain = plot(t_trame, s_trame, title = \"Signal\")\n",
|
|
"freq_domain = plot(freqs, abs.(F), title = \"Spectrum\", xlim=(-1000, +1000)) \n",
|
|
"plot(time_domain, freq_domain, layout = 2)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"i_s = floor(Int, t_s*fs-number_trame*trame_period*fs+1)\n",
|
|
"i_e = floor(Int, i_s+2*number_trame*trame_period*fs)\n",
|
|
"t_trame = t[i_s:i_e]\n",
|
|
"s_trame = s[i_s:i_e]\n",
|
|
"\n",
|
|
"# Fourier Transform of it \n",
|
|
"s_pad = zeros(N_fft)\n",
|
|
"s_pad[1:size(s_trame,1), 1:size(s_trame,2)]=s_trame\n",
|
|
"F = fft(s_pad) |> fftshift\n",
|
|
"freqs = fftfreq(N_fft, fs) |> fftshift\n",
|
|
"\n",
|
|
"# plots \n",
|
|
"time_domain = plot(t_trame, s_trame, title = \"Signal\")\n",
|
|
"freq_domain = plot(freqs, abs.(F), title = \"Spectrum\", xlim=(-1000, +1000)) \n",
|
|
"plot(time_domain, freq_domain, layout = 2)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"On cherche maintenant la fréquence du fondamental. Comme il s'agit d'un instrument à vent, on choisit notre interval de fréquence."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"using WORLD\n",
|
|
"\n",
|
|
"f0, timeaxis = harvest(s, fs, HarvestOption(floor_freq, ceil_freq, trame_period));#floor and ceil freq, period\n",
|
|
"plot(timeaxis, f0)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"On observe des vibratos, par exemple un gros vibrato vers 5s, un \"fa\". La fréquence du son ne correspond pas exactement à la fréquence du fondamental. On a une modulation de fréquence.\n",
|
|
"\n",
|
|
"/TODO étudier cette modulation de fréquence\n",
|
|
"\n",
|
|
"Regardons un zoom sur un vibrato. \n",
|
|
"\n",
|
|
"/TODO fft du petit bout de signal"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"\n",
|
|
"i_s = floor(Int, t_s*fs-number_trame*trame_period*fs+1)\n",
|
|
"i_e = floor(Int, i_s+2*number_trame*trame_period*fs)\n",
|
|
"t_trame = t[i_s:i_e]\n",
|
|
"s_trame = s[i_s:i_e]\n",
|
|
"\n",
|
|
"f0, timeaxis = harvest(s_trame, fs, HarvestOption(floor_freq, ceil_freq, trame_period));#floor and ceil freq, period\n",
|
|
"plot(timeaxis.+t_trame[1], f0)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"On va s'intéresser maintenant au spectrogramme.\n",
|
|
"\n",
|
|
"\\TODO On choisit une fenêtre XXXX car XXX"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"using DSP, PyPlot\n",
|
|
"\n",
|
|
"println(floor(Int, trame_period*fs), floor(Int, overlap*fs))\n",
|
|
"S = spectrogram(s, floor(Int, trame_period*fs), floor(Int, overlap*fs); fs=fs, window=hanning)\n",
|
|
"t = time(S)\n",
|
|
"f = freq(S)\n",
|
|
"imshow(reverse(log10.(power(S)), dims=1), extent=[first(t), last(t), first(f), last(f)], aspect=\"auto\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Zoom sur notre vibrato que l'on voit un peu"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"S = spectrogram(s_trame, floor(Int, trame_period*fs), floor(Int, overlap*fs); fs=fs, window=hanning)\n",
|
|
"t = time(S)\n",
|
|
"f = freq(S)\n",
|
|
"imshow(reverse(log10.(power(S)), dims=1), extent=[first(t).+t_trame[1], last(t).+t_trame[1], first(f), last(f)], aspect=\"auto\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Julia 1.2.0",
|
|
"language": "julia",
|
|
"name": "julia-1.2"
|
|
},
|
|
"language_info": {
|
|
"file_extension": ".jl",
|
|
"mimetype": "application/julia",
|
|
"name": "julia",
|
|
"version": "1.2.0"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
}
|