Skip to content

Song-Approximation is a university project developed for a Numerical Calculus course (2025). The project focuses on compressing or approximating audio files using Singular Value Decomposition (SVD).

Notifications You must be signed in to change notification settings

Mach3tryhard/Song-Approximation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

100 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Aproximarea unei melodii folosind mai multe metode de calcul numeric

Autori:

  • Popa Mircea Alexandru
  • Sîrghe Matei-Ștefan
  • Ungureanu Robert Anton

Data: 3 Iunie 2025


1. Modelul matematic

  • Modelul ales de noi începe de la orice fișier audio de tip .wav, 16 bitrate, mono.
  • Fișierul audio poate fi interpretat ca o amplitudine în funcție de timp. Astfel, ne putem imagina că avem o funcție de tipul $f(t)$, unde $t$ este timpul și $f(t)$ este amplitudinea sunetului la acel moment.
  • Pentru a interpreta funcția cu o acuratețe mai mare, vom aplica Short-Time Fourier Transform (STFT), care ne va permite să vedem frecvențele care compun sunetul.
  • Astfel, vom ajunge la o funcție $F(\tau, \omega)$ pe care o împărțim în matricea $A$ (care conține modulul părții reale) și matricea $\varphi$ (care conține coeficientul de unghi).
  • Vom aplica SVD (Singular Value Decomposition) pe matricea $F(\tau, \omega)$. Factorizarea QR va fi folosită pentru a descompune $A$ în valori proprii.
  • Aplicând SVD, vom obține matricea $A \approx U\Sigma V^T$, unde $U$ și $V$ sunt matricile ortogonale, iar $\Sigma$ este o matrice diagonală cu valorile pozitive.
  • Înmulțind cele 3 matrici, obținem o aproximare a matricei originale $B$, care este interpretată ca funcția $G(\tau, \omega)$.
  • Cu funcția $G(\tau, \omega)$ vom calcula Short-Time Fourier Transform inversă, care ne va permite să obținem o nouă funcție $g(t)$, aproximarea funcției originale $f(t)$.
  • Cu aproximarea $g(t)$ vom putea obține un nou fișier audio .wav, care este o aproximare a fișierului original.

Formule Principale

$$ F(\tau, \omega) = \sum_{t=0}^{N-1} f(t)w(t-\tau)e^{-i\omega t} $$

$$ Z_{i,j} = F(i, j), \quad Z \in \mathcal{M}_{N,M}(\mathbb{C}) $$

$$ A = |Z|, \quad A \in \mathcal{M}_{N,M}(\mathbb{R}) $$

Pentru $\forall z_{n,m} = a_{n,m} + ib_{n,m} \in Z$, unde $n \in [0, N], m \in [0, M]$, există $\theta_{n,m} = \tan^{-1} \left( \frac{b_{n,m}}{a_{n,m}} \right)$.

Matricea de fază $\varphi$:

$$ \varphi = \begin{bmatrix} \theta_{1,1} & \theta_{1,2} & \dots & \theta_{1,N} \\ \theta_{2,1} & \theta_{2,2} & \dots & \theta_{2,N} \\ \vdots & \vdots & \ddots & \vdots \\ \theta_{M,1} & \theta_{M,2} & \dots & \theta_{M,N} \end{bmatrix} $$

Descompunerea SVD:

$$ A \approx U\Sigma V^* = \sum_{i=1}^{k} \sigma_i u_i v_i^* = B $$

Reconstrucția funcției complexe:

$$ G(i, j) = B_{i,j} + \varphi_{i,j}, \quad B \in \mathcal{M}_{N,M}(\mathbb{C}) $$

Transformata inversă (ecuația 1):

$$ g(t) = w(t^{-1}-\tau) \frac{1}{2\pi} \sum_{\omega=0}^{N-1} G(\tau, \omega)e^{+i\omega t} $$

1.1 Discretizarea domeniului

Domeniul este reprezentat de durata melodiei înmulțită cu rata de eșantionare (sampling rate) de 44100 Hz.

$$ N = l \times h \quad (2) $$

Unde:

  • $l$ este durata melodiei în secunde.
  • $h$ este sampling rate-ul implicit de 44100 Hz.
  • $M$ este numărul de frecvențe pe care îl conține o melodie.

1.2 Transformata Fourier

Teoretic, Short-Time Fourier Transform este:

$$ F(\tau, \omega) = \int_{-\infty}^{+\infty} f(t)w(t-\tau)e^{-i\omega t}dt \quad (3) $$

Deoarece funcția $f(t)$ este discretizată, vom folosi transformarea discretă pentru a calcula $F(\tau, \omega)$:

$$ F(\tau, \omega) = \sum_{t=0}^{N-1} f(t)w(t-\tau)e^{-i\omega t} \quad (4) $$

Vom avea matricea care va fi și spectograma originală a funcției $f(t)$:

$$ A = \begin{bmatrix} |F(\tau_1, \omega_1)| & |F(\tau_1, \omega_2)| & \dots & |F(\tau_1, \omega_M)| \\ |F(\tau_2, \omega_1)| & |F(\tau_2, \omega_2)| & \dots & |F(\tau_2, \omega_M)| \\ \dots & \dots & \dots & \dots \\ |F(\tau_N, \omega_1)| & |F(\tau_N, \omega_2)| & \dots & |F(\tau_N, \omega_M)| \end{bmatrix} \quad (5) $$

Cu partea imaginară a funcției $F(\tau, \omega)$ vom crea matricea $\varphi$ astfel:

$$ \varphi = \begin{bmatrix} \tan^{-1}(\frac{b_{1,1}}{a_{1,1}}) & \tan^{-1}(\frac{b_{1,2}}{a_{1,2}}) & \dots & \tan^{-1}(\frac{b_{1,M}}{a_{1,M}}) \\ \tan^{-1}(\frac{b_{2,1}}{a_{2,1}}) & \tan^{-1}(\frac{b_{2,2}}{a_{2,2}}) & \dots & \tan^{-1}(\frac{b_{2,M}}{a_{2,M}}) \\ \dots & \dots & \dots & \dots \\ \tan^{-1}(\frac{b_{N,1}}{a_{N,1}}) & \tan^{-1}(\frac{b_{N,2}}{a_{N,2}}) & \dots & \tan^{-1}(\frac{b_{N,M}}{a_{N,M}}) \end{bmatrix} \quad (6) $$

1.3 Sistemul Liniar

Teoretic, factorizarea SVD este:

$$ A = U\Sigma V^T = \sum_{i=1}^{k} \sigma_i u_i v_i^* \quad (7) $$

Din cauza erorilor de floating point, vom obține o matrice aproximativă $B$ care este diferită de cea de la care am pornit:

$$ B = U\Sigma V^T \approx A \quad (8) $$

Pentru a calcula $U$ și $V$, vom aplica factorizarea QR. Obținem $Vx = U^Tb$, iar $A = UV$. Utilizând metoda substituției descendente putem rezolva acest sistem în $O(n^2)$ pași:

$$ \begin{cases} A^T Ax = A^T b \\ (UV)^T UVx = (UV)^T b \\ V^T U^T UVx = V^T U^T b \\ (V^T)^{-1} V^T Vx = V^T U^T b \\ Vx = U^T b \end{cases} \quad (9) $$

Pentru matricea $\Sigma$, valorile proprii ale matricei $A^T A$ se folosesc pentru a determina valorile singulare $\sigma_i$. Acestea sunt calculate astfel:

$$ \sigma_i = \sqrt{\lambda_i}, \text{ unde } \lambda_i \text{ sunt valorile proprii ale } A^T A \quad (10) $$

Matricea $\Sigma$ este o matrice diagonală unde $\sigma_1 \ge \sigma_2 \ge \dots \ge \sigma_k \ge 0$, iar $k = \min(N, M)$:

$$ \Sigma = \begin{bmatrix} \sigma_1 & 0 & \dots & 0 \\ 0 & \sigma_2 & \dots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \dots & \sigma_k \end{bmatrix} \quad (11) $$

Putem crea o funcție $G(\tau, \omega)$ care primește valorile din matricea $B$ și care este definită ca:

$$ G(\tau, \omega) = \begin{cases} B_{i,j} & \text{dacă } i \le N \text{ și } j \le M \\ 0 & \text{altfel} \end{cases} \quad (12) $$

Utilizând noua funcție, putem crea o nouă spectogramă care ne va arăta eroarea de aproximare:

$$ S_e = \begin{bmatrix} |F(\tau_1, \omega_M) - G(\tau_1, \omega_M)| & \dots & |F(\tau_N, \omega_M) - G(\tau_N, \omega_M)| \\ \dots & \dots & \dots \\ |F(\tau_1, \omega_1) - G(\tau_1, \omega_1)| & \dots & |F(\tau_N, \omega_1) - G(\tau_N, \omega_1)| \end{bmatrix} \quad (13) $$

1.4 Transformata Fourier Inversă

Calculăm aproximarea funcției originale $f(t)$ folosind Short-Time Fourier Transform inversă. Teoretic:

$$ g(t) = \frac{1}{w(t-\tau)} \frac{1}{2\pi} \int_{-\infty}^{+\infty} G(\tau, \omega)e^{+i\omega t} d\omega \quad (14) $$

Deoarece funcția $G(\tau, \omega)$ este discretizată, vom folosi transformata discretă pentru a calcula $g(t)$:

$$ g(t) = \frac{1}{w(t-\tau)} \frac{1}{2\pi} \sum_{\omega=0}^{N-1} G(\tau, \omega)e^{+i\omega t} \quad (15) $$

Cu funcția $g(t)$ vom crea o nouă funcție $f_{ea}$ care reprezintă eroarea la un anumit timp și funcția $f_{cea}$ care reprezintă eroarea cumulată a aproximării:

$$ f_{cea} = \sum_{t=0}^{N-1} |f(t) - g(t)| \quad (16) $$

$$ f_{ea} = |f(t) - g(t)| \quad (17) $$

About

Song-Approximation is a university project developed for a Numerical Calculus course (2025). The project focuses on compressing or approximating audio files using Singular Value Decomposition (SVD).

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •