Cara lain untuk menguraikan sinyal menjadi spektrum

Hai semuanya, di sini saya ingin berbicara tentang algoritma analisis sinyal audio yang memungkinkan Anda untuk mengurai sinyal menjadi gelombang yang terpisah, tentu saja itu tidak memberikan akurasi 100%, tetapi bagaimanapun hasilnya cukup bagus menurut saya.

gambar

Bekerja pada musik apa pun paling baik dilihat:


Dan tautan ke contoh lain dari genre yang berbeda. Metaldeth-Tornado jiwa:


Tidak terhubung:


Jadi untuk dekomposisi Anda perlu melakukan langkah-langkah berikut:

- Dari sinyal asli Anda perlu mendapatkan 8 sinyal menengah;
- Dari sinyal perantara ini dan sinyal asli Anda perlu mendapatkan 8 sinyal - lapisan, yang dapat dibongkar menjadi gelombang terpisah;
- Untuk menghitung berapa banyak gelombang di setiap lapisan dan berapa amplitudo mereka.

Sekarang, lebih lanjut tentang masing-masing tahap: untuk mendapatkan sinyal perantara, Anda perlu mengambil turunan dari sinyal asli. Intinya, ini adalah turunan dari fungsi diskrit. Untuk menemukannya untuk setiap momen dari sinyal asli, Anda perlu mengatur 1 parameter: periode untuk mana turunan ini berada. Nilai turunannya adalah koefisien kemiringan dalam interval yang diberikan, misalnya, dapat ditemukan dengan metode kuadrat terkecil.

Diperlukan untuk menghitung 8 sinyal menengah dengan 8 periode yang berbeda. Set periode yang paling sederhana: 4, 8, 16, 32, 64, 128, 256, 512. Ketika suatu periode ditentukan, untuk setiap sampel sinyal, turunannya dihitung menggunakan rumus kuadrat terkecil. Ini seperti rata-rata bergerak, tetapi di sini ini bukan rata-rata bergerak tetapi turunan dari interval saat ini.

Dengan demikian, diperoleh 8 sinyal dan 1 sumber. Sekarang masing-masing dari 8 sinyal turunan perlu diintegrasikan. Dalam hal ini, ini berarti bahwa setiap sampel berikutnya sama dengan jumlah semua sampel sebelumnya. Setelah itu, 8 lapisan menengah diperoleh.

Langkah selanjutnya adalah mendapatkan lapisan yang bisa dibongkar menjadi gelombang terpisah. Jadi sekarang Anda perlu mendapatkan 8 layer. Lapisan dihitung seperti ini:

layer 0 = sinyal 0-out antara
layer1 = intermediate1-intermediate0
layer2 = intermediate2-intermediate1
layer3 = intermediate3-intermediate2
layer4 = menengah 4-menengah3
layer5 = intermediate5-intermediate4
layer6 = intermediate6-intermediate5
layer7 = menengah 7-menengah6
layer8 = intermediate7

Lapisan terakhir bukan perbedaan, tetapi hanya sama dengan sinyal menengah terakhir.

Anda dapat mencoba secara berbeda, yaitu, untuk menghitung sinyal antara berikutnya dari yang sebelumnya. Namun dalam program saat ini, 1 opsi digunakan.

Sekarang, untuk mem-parsing layer menjadi gelombang terpisah, Anda hanya perlu menghitung area di mana nilai meningkat dan di mana mereka berkurang. Sebenarnya durasi bagian adalah panjang gelombangnya. Bagian dari sinyal di mana nilai sinyal konstan Anda hanya perlu melewati. Untuk menemukan amplitudo sinyal dalam spektrum dalam interval tertentu, Anda perlu menambahkan semua amplitudo gelombang dikalikan panjangnya.

gambar

Kode yang menghitung sinyal perantara terlihat seperti ini:

disini waveize adalah jumlah sampel
signal [] - array dengan sinyal asli
SY = 0, SX = 0, SXX = 0, SXY = 0, Ky = 0 - variabel tipe float
Step2 = STEP / 2 di mana STEP adalah periode (4,8,16,32,64,128,256,512)

for(int i=Step2;i<wavesize-Step2;i++){ SY=0,SX=0,SXX=0,SXY=0,Ky=0; for(int j=i-Step2,fromZ=0;j<i+Step2;j++,fromZ++){ SX+=fromZ; SY+=signal[j]; SXX+=fromZ*fromZ; SXY+=fromZ*signal[j]; } Ky=float((STEP)*SXY-SX*SY)/float((STEP)*SXX-SX*SX); OutSignal[i]=OutSignal[i-1]+Ky; } 

Untuk mengurangi satu sinyal dari yang lain, cukup kurangi masing-masing sampel dari masing-masing.
Misalnya, untuk 0 lapisan:

 for(int i=0;i<wavesize-1;i++) layer0[i]=OutSignal0[i]-Signal[i]; 

Jika Anda menambahkan semua lapisan dan mengambil yang terakhir dengan tanda yang berlawanan, Anda mendapatkan sinyal asli, sehingga mengalikan lapisan mana pun, dimungkinkan untuk membuat filter frekuensi. Pertanyaan selanjutnya adalah bagaimana menghitung amplitudo harmonisa spesifik. Faktanya adalah bahwa dalam interval konstan, misalnya = 4000 sampel, bisa ada banyak gelombang pendek dan relatif sedikit.

Anda tentu saja dapat menemukan amplitudo rata-rata untuk setiap lapisan dan menambahkan. Tetapi metode ini tidak terlalu baik karena hanya ada sedikit gelombang yang panjang, dan amplitudo mereka biasanya sangat besar, dan amplitudo ketidakseragaman yang kuat diperoleh pada frekuensi rendah.

Dalam program yang menampilkan musik berwarna dengan tautan, amplitudo setiap harmonik dihitung sebagai: amplitudo gelombang * panjangnya. Semua sama, ketidakmerataan muncul, tetapi tidak sekuat dalam kasus rata-rata.

Secara umum, saya tidak berpikir bahwa seseorang menganggap suara sebagai penguraian menjadi spektrum, melainkan suara terdiri dari gambar suara, yang terdiri dari gelombang dengan panjang yang berbeda. Dengan demikian, volume suara agak volume rata-rata dari semua gelombang yang terdiri dari suara. Tetapi belum jelas parameter apa yang membentuk gambar suara, mungkin frekuensi rata-rata, standar deviasi, atau yang lainnya.

Source: https://habr.com/ru/post/id410357/


All Articles