İki digital ses verisini üst üste bindirmek

Başlatan Gökhan BEKEN, 29 Ekim 2015, 00:01:06

Gökhan BEKEN

Audio işi benim çok ilgimi çekiyor, bu konuda olan bilgimi artırmak için deneyler yapıyorum.
Audio ile ilgili programlar, birden fazla sesi üst üste bindirerek tek bir ses olarak kaydedebiliyor veya aynı anda hepsini birden çalabiliyor(zannedersem ikisi de aynı mantık)

Bu işi nasıl yapıyor?
Verileri birbiri ile "OR" işlemine mi tabi tutuyor? Yoksa daha karmaşık algoritmalar mı uygulanıyor? Eğer 2 değilde 3 dosya olsaydı farklı mı olurdu?

Diyelim ki bu işi başarıyla yaptık, peki sesin biri diğerine göre daha az duyulsun(kısım volüme). Bunu nasıl yaparız?
Özel mesaj okumuyorum, lütfen göndermeyin.

parametre

bunu butun sarkılardami istiyorsunuz yoksa belli şarkılarda mi belli sarkılarda istiyorsanız eğer sony sound forge adlı programı bilgisayarınıza kurun sol kanalı bir sarkıyı diğerine diğer parçayı kopyalaynız winampta sag ve sol ses ayarından yapabiliyorsunuz aradığınız bu mudur ?

Gökhan BEKEN

Yok hocam, program kullanarak yapamayan yoktur sanırım.
Ben programlar bu işlemi nasıl yapıyor hangi algoritmalarla yapıyor onu merak ediyorum.
Çünkü kendim böyle bir program yazacağım, konuya olan merakımı gidermek için.
Özel mesaj okumuyorum, lütfen göndermeyin.

z

Ses1+Ses2 gibi toplama işleminden ibaret.

mesaj birleştirme:: 29 Ekim 2015, 01:30:11

1. sesin 1.sample'ı + 2.sesin 2.sample'ı eşittir yeni dosyanın 1. sample değeri
........
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Gökhan BEKEN

Toplama işlemi mi or işlemi mi hocam?
Örnek 8 bit derinliğinde bir ses dosyası olsun.
örneklerin sıradaki byteları 128 ve 128 olsun. Toplamları 0 yapacaktır.

Bu arada volume kısma işlemi de kafamda soru işareti...
Özel mesaj okumuyorum, lütfen göndermeyin.

z

Toplama.

Bahsettiğin sorun şöyle aşılır.

Ses1/2 +Ses2/2

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Gökhan BEKEN

#6
Hocam programı yazdım,
Ses1/2 +Ses2/2
yapınca ses bozuldu

Ses1 +Ses2
yapınca sesler sorunsuz bir şekilde birleşti.

Bu deneyi 2 dosyada da yaptım, 3 dosyada da yaptım, sonuç mükemmel.

İlk sorumun cevabını almış oldum.

Volüme kısma veya artırma konusunda çarpma veya bölme kullandım ama ses bozuluyor. Gerçi 2 ile çarpınca ses bozulmadan çok az bir şey yükseliyor ama daha yüksek bir sayıyla çarpınca bozuluyor. Bölme işleminde ise 2'ye bile bölsem bozuluyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

engerex

Alçakta düşürmede toplama çıkarma olabilir.

t2

#8
8bit için Volumu %10 artırmak şöyle:

(Sample- 128) ile DC bileşeni sildik. Kalanı 1.1ile carptik ses %10 arttı. Ses şimdi negatif veya pozitif. Ortası 0. Yani DC bileşeni 0.

Şimdi yeniden +128 ile DC ekliyoruz. hepsi pozitif oldu. Tabi ki  0 ile 255 arasında olmalı.

Bunları yaparken integer kullanılır. bayta çevirmeden önce, kirpilma varmı diye bakılır.
255ten büyükse 255e eşitlenir. Sıfırdan kucukse sıfıra esitlenir.

Sonunda bayta cevrilir.



mesaj birleştirme:: 29 Ekim 2015, 09:29:08

Toplanan mix edilen seslerin volümü fazla oluyorsa önce her biri bu yöntemle kısılır.

Gökhan BEKEN

@t2 hocam sesi iki katına çıkartmak istedim ama ses bozuldu, sonra 2 katı kısmak için 2'ye böldüm ama yine aynı şekilde bozuldu.
Kodlar şu şekilde:
int temp=0;
temp=(sample-32767)*2;
temp+=32767;
if(temp>0xFFFF)temp=0xFFFF;
sample=temp;

"sample" adlı değişken sesin bozulmamış örneğini tutuyor. "temp" adlı değişkeni de dediğiniz gibi int yapmak için tanımladım.
Ses 16 bitlik olduğu için 128 yerine 32767 kullandım.
Özel mesaj okumuyorum, lütfen göndermeyin.

OG

Ses toplandıktan sonraki değer 0dB'i yani 1V pick i aşarsa ses sistemleri limiterleri devreye sokar. Limiter sesin üst kısmını bıçak ile keser gibi keser ve sesin orjinalliği bozulur.

Toplama yapmadan önce, toplama sonrası bu değerin aşılıp aşılmadığını kontrol etmek ve gereken önlem alınarak toplamak gerekir.

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

t2

#11
16bit ile 8 bit yapısı farklı. 16 bit olunca dc çıkarmaya gerek yok.
Zaten ortası sıfır oluyor.  ses -32767 ... +32767 arası değişiyor


16bit datayı 2 ile çarpmak için olması gereken kod şöyle:

LONG temp=0;
temp= sample *2;

if(temp>32767 )temp=32767 ;
if(temp<-32767)temp=-32767;


sample=(int) temp;




Alıntı yapılan: Gökhan BEKEN - 29 Ekim 2015, 20:17:26
@t2 hocam sesi iki katına çıkartmak istedim ama ses bozuldu, sonra 2 katı kısmak için 2'ye böldüm ama yine aynı şekilde bozuldu.

Karamel

gokhan hocam ben yazin bunun deneylerini yapmistim. cok basit oldugundan tartismaya deger bulmamistim.

sesimiz mono olsun. sample imizi float bir variable icersine alalim.

bunu x/100 ile carpalim. x burada bizim volume variable imiz. 0 ile 100 arasinda birseyler secebilirsiniz. 100 den buyuk olursa sesi boost eder. buda OG hocamin dedigi gibi bozulmalara neden olabilir.

daha sonra bu float varible i int icersine yerlestirelim. yani virgulden sonraki kismi atmis olalim. biz simdi ne yaptik?

mesela sample imiz 32767 biz sesi %40 yapmak istiyoruz.

32767* (40/100) = 13106,8

bunu int donusumu yaparsak. = 13106

-32767 olaydi. sonuc = - 13106

sound signal i + ile - arasinda degisiyor. 0 noktasinda sessizlik olusuyor. siz pointleri 0 dan ne kadar uzaklastirsaniz(max OG hocamin dedigi limite kadar gelebilirsiniz) ses okadar acilir. ne kadar yakinlastirirsaniz. ses o kadar kisilir.

Gökhan BEKEN

@t2 Hocam teşekkür ederim. Dediğinizi yapınca ilk başta olmadı ama "sample" değişkenini unsigned short tanımlamışım, onu short yapınca düzeldi.
Tabi sesi fazla artırınca ister istemez bir tırmalama başlıyor ama normaldir. Sesi kısma işi de gayet düzgün.

Audio ile ilgili yapacak çok işim var. Tavsiyelerinizi dinlerim.
Özel mesaj okumuyorum, lütfen göndermeyin.

t2

Ses dosyasını başarıyla işlemek  için çerçeve süresi belirlenir. diyelim ki 5ms olsun. datayı işlemeden önce 5ms okuruz. tepesi nedir diye bakarız.
daha sonra volumu açacak isek,  tepesi  maksimumu geçmeyecek şekilde tüm datayı çarparız. böylece kırpılmaz olmaz.


Tepeyi bulmak için 5ms yerine hepsini okusak olmaz mı?
Olmaz. Çünkü sesin bir bölümü çok kısık ortası normal, başka bölümünde ise gürültü vardır. Pıt diye bir gürültü var. o da maksimum olmuş ise bunu dikkate alıp volum artırmaya çalışırsak, sesin genelinde volum  hiç artmamış gibi olur. yani çerçeve şart. hatta çerçeveleri birbirinden ayrı değil, girişimli yapmalı. önceki çerçeve ile sonraki çerçeve arasında ortak bir bölge olmalı.