Ses sinyallerini kırpmadan karıştırma algoritması


49

İki veya daha fazla PCM ses kanalını (örneğin kaydedilmiş örnekler) dijital olarak akustik olarak sadık bir şekilde, tercihen gerçek zamana yakın (çok az veya hiç gözetleme yok) karıştırmak istiyorum.

Bunu yapmanın fiziksel olarak "doğru" yolu, örnekleri toplamaktır. Ancak iki rastgele örnek eklediğinizde, ortaya çıkan değer maksimum değerin iki katına kadar olabilir.

Örneğin, numuneleriniz 16 bitlik değer ise, sonuç 65536 * 2'ye kadar olacaktır. Bu kırpma ile sonuçlanır.

Buradaki saf çözüm, N'nin bölünmesidir, burada N, karıştırılan kanalların sayısıdır. Bununla birlikte, bu, her bir numunenin yüksek sesle 1 / N olmasına neden olur ve bu tamamen gerçekçi değildir. Gerçek dünyada, iki enstrüman aynı anda çaldığında, her enstrüman yarı yüksek sesle olmaz.

Etrafı okumaktan, ortak bir karıştırma yöntemi: sonuc = A + B - AB, burada A ve B iki normalize edilmiş numunenin karıştırılmasıdır ve AB, daha yüksek seslerin giderek daha "yumuşak şekilde kırpılmasını" sağlayan bir terimdir.

Ancak, bu sinyalin bozulmasına neden olur. Bu bozulma seviyesi yüksek kaliteli ses sentezinde kabul edilebilir mi?

Bu sorunu çözmek için başka hangi yöntemler var? Verimli düşük kaliteli algoritmalar ve daha az verimli yüksek kaliteli algoritmalar ile ilgileniyorum.

Birden fazla enstrümanı bir araya getirmek için dijital müzik sentezi bağlamında sorumu soruyorum. Parçalar sentezlenmiş ses, önceden kaydedilmiş örnekler veya gerçek zamanlı mikrofon girişi olabilir.


Sinyalleri biraz zaman kaydırarak kırpmayı önlemek için ne sıklıkta mümkün olduğunu merak ediyorum.
Sebastian Reichelt

İyi fikir, o kadar basit olmadığından şüpheleniyor olmama rağmen, özellikle de çok fazla bakışınız olmadığında (örneğin gerçek zamanlı olarak). Sorun şu ki, ne tür bir zaman kaymasının uygun olacağını bilmek için örneği önceden bilmek zorundasınız. Bununla birlikte, çoğu müzikte, yüksek bir korelasyon olasılığına sahip olacağınızı söyledi, bu yüzden biraz rastgele zaman kaydırma işlemi çok iyi sonuç verebilir. Burada çizim tecrübesi olan var mı?
bryhoyt

2
@bryhoyt: Gerçek karıştırıcılar sinyalleri bir araya toplar. Bu kadar. Zaman gecikmesi veya doğrusal olmayan işlem gerekmez. Kırpma bir sorun değil çünkü orijinal sinyaller yüksek sesle olmadı.
endolith

2
16 + 16bit = 17bits ;-)
nikwal 23:16

1
sadece giriş sayısına bölün, ardından kırpma yapılamaz. ve eğer ses çok sessiz ise, amplifikatörü açın…
Sarge Borsch

Yanıtlar:


14

Sorununuz için herhangi bir bağlam bilmeden sizi ilgili tekniklere yönlendirmek çok zor.

Açıkça cevap, her numunenin kazancını ayarlamanızı sağlamaktır, böylece kırpma nadiren gerçekleşir. Müzisyenlerin bir toplulukta solo oynamak istediklerinden daha yumuşak oynayacağını varsaymak gerçekçi değildir.

A + B - AB tarafından ortaya çıkan bozulma kabul edilemez. B harmoniklerinin her iki tarafında A - B'nin tamsayı oranlarında olmayan harmoniklerle zengin bir spektruma sahip olması durumunda oldukça kötü olan ring-modülasyonuna eşdeğer - A'nın ayna görüntülerini oluşturur. Örneğin 220 ve 400 Hz'de iki kare dalga üzerinde deneyin.

Örnek başına örnek olarak çalışan daha "doğal" bir kırpma işlevi, tanh işlevidir - aslında bazı analog öğelerin yumuşak sınırlayıcı davranışına uyar. Bunun ötesinde, klasik dinamik sıkıştırma tekniklerine bakabilirsiniz - sisteminiz ileriye bakabilir ve zirveleri önceden görebiliyorsa, bu daha da iyidir.


4
İlaveler ve sert kırpma. Herhangi bir açık kaynaklı mod oynatıcısına bakın. Karıştırmayı en aza indirmek için uygun şekilde ölçeklendirilmiş girdilerle karıştırmak için bir ilave kullanılması ve daha sonra sert sınırlayıcı (isteğe bağlı olarak yumuşak) istisna değil, normdur ...
pichenettes 7:12

4
Çoğu durumda bu sorunu çözmek için geliştiricinin sorumluluğu değildir. Kullanıcıya / besteciye, her kanalın ses seviyesini ayarlama imkanı verirsiniz ve kırpmanın onlar tarafından kabul edilebileceği şekilde karışımın yapılması kullanıcıya bağlıdır. Örneğin, Renoise'da, varsayılan olarak, her bir enstrüman / notun kazancı 1'dir ve parçalar eklenirken şeyler kötü şekilde kırpılmaya başlar - notların veya enstrümanların sesini, modülün üzerinde kırpılmasını önlemek üzere ayarlamak, kullanıcıya bağlıdır. ana parça (istenmedikçe). İşte bunu gösteren bir ekran görüntüsü: i.imgur.com/KVxDt.png .
pichenettes

2
IIRC, FastTracker, her parçaya bir zayıflama uyguladıktan sonra daha muhafazakardı ve daha sonra tercih iletişim kutusunda x1'den x32'ye kadar küresel bir "makyaj kazancı" elde etti. Ben varken bir CD için .WAV için bütün modülleri işlemek için unutmayın, ben en düşük kırpma neden olmadı tane ... bulana kadar kazanç değerlerini denemek zorundaydım
pichenettes

2
Zayıflama seviyesiyle ilgili olarak, döngüde bir kullanıcının bulunmaması durumunda; 1/32 kesinlikle güvenli bir seviyedir (kırpma yok). Kanalların birbiriyle ilişkili olmadığı varsayılırsa (bu müzik için çok doğru değildir - arka plan ambiyanslarını karıştırırken daha doğrudur), 1 / sqrt (32) değeri ses yüksekliği ve kırpma olasılığı arasında iyi bir uzlaşma olabilir. En iyi çözüm hala 1/32 kullanmak ve sonra numunelerinizi dinamik bir kompresör ile işlemden geçirmek olacaktır.
pichenettes

3
İlaveler. Donanım mikserlerinin zaten yaptığı şey budur ve insanların işlerin böyle davranmasını bekler. Sistem düzeyinde mikserler basitçe klipslenir. Sistem sürücüleri herhangi bir doğrusal olmayan işlemden geçirmişlerse, bu büyük bir problem olurdu - mastering mühendislerinin, duydukları şeylerin kompresör eklenti ayarları mı yoksa bazı sistem düzeyinde dinamik işlemler mi olduğunu anlamaya çalışmanın acısını hayal ediyorum. Müzik prodüksiyon yazılımı geniş bir dinamik sıkıştırma eklentisi paleti sunar, karışımlarının klipslenmemesini sağlamak kullanıcının sorumluluğundadır.
pichenettes

16

Bunu yapmanın fiziksel olarak "doğru" yolu, örnekleri toplamaktır. Ancak iki rastgele örnek eklediğinizde, ortaya çıkan değer maksimum değerin iki katına kadar olabilir. ... Buradaki saf çözüm, N'nin bölünmesidir, burada N, karıştırılan kanalların sayısıdır.

Bu "naif" çözüm değil, tek çözüm. Her analog ve dijital mikserin yaptığı budur, çünkü hava böyle yapar ve beyninizin yaptığı budur.

Ne yazık ki, bu diğer doğrusal olmayan "karıştırma" (bozulma) algoritmalarının gösterdiği gibi, yaygın bir yanılgı olarak görünmektedir:

“N'ye bölme” boşluk odası olarak adlandırılır ; dalga formunun RMS seviyesinin üzerinde tahsis edilen tepe noktaları için ekstra alan. Bir sinyal için gereken tavan boşluğu miktarı, sinyalin tepe faktörü ile belirlenir . (Dijital sinyal seviyelerinin ve tavan boşluğunun yanlış anlaşılması, muhtemelen kısmen Loudness savaşını ve Elephunk'u suçluyor .)

Analog donanımda, tavan boşluğu belki 20 dB'dir. Bir donanım DSP'sinde, sabit nokta genellikle sabit bir tavan boşluğu ile kullanılır; AD'nin SigmaDSP'si örneğin 24 dB kafa boşluğuna sahip. Bilgisayar yazılımında, ses işleme genellikle 32 bit kayan nokta ile yapılır, bu nedenle tavan boşluğu muazzamdır.

İdeal olarak, N ile bölmeniz gerekmez, sinyalleri bir araya toplarsınız, çünkü sinyalleriniz ilk başta 0 dBFS'de üretilmez.

Zaten çoğu sinyal birbiriyle korele değildir, bu nedenle mikserin tüm kanallarının aynı anda yapıcı olarak karışması nadirdir. Evet, aynı 10 faz içi sinüs dalgalarını karıştırmak, tepe seviyesini 10 kat artıracak (20 dB), ancak tutarlı olmayan 10 gürültü kaynağının karıştırılması, tepe seviyesini yalnızca 3,2 kat artıracak (10 dB). Gerçek sinyaller için değer bu uç değerler arasında olacaktır.

Karışık sinyali kırpma olmadan bir DAC'den çıkarmak için, karışımın kazancını azaltmanız yeterlidir. Karışımın RMS seviyesini sert bir şekilde kırpmadan yüksek tutmak istiyorsanız , dalga formunun tepe noktalarını sınırlamak için bir tür sıkıştırma uygulamanız gerekecektir , ancak bu karışımın bir parçası değildir, bu ayrı bir adımdır. Önce bol miktarda tavan boşluğu ile karıştırın, ardından istenirse daha sonra dinamik aralık sıkıştırmasına geçirin.


1
Bu kavramları anlıyorum ama tam olarak doğru olduğundan emin değilim. Tabii, eğer bir grup 16-bit örnek eklersem, 32 bit bana sayısal oda yığınları verir. Ama yine de ortaya çıkan karışımı, gerçek dünyadaki bir ses sisteminde normalleştirilmiş bir ses seviyesinde çalmam gerekiyor. Her kanalın ayrı ayrı çalınmasından 2 kanal daha yüksek ses çıkmasını istiyorum, ancak kırpmayı istemiyorum. Toplamları 32 hatta 64 bit yapmak, buna yardımcı olmaz. Belki de kendi soruma cevap vermeye başlıyorum: orijinal örnekler maksimum genlikten daha sessiz bir seviyede normalleştirilmelidir. Önerdiğin gibi, biraz kafa karıştırıcı bırakarak.
bryhoyt

3
@bryhoyt: Evet, ama dalgaların birbirleriyle nadiren korelasyon içinde olduklarını da hatırlamanız gerekir, böylece 5 ses eklemek birlikte 5 kat daha yüksek tepeler yapmaz.
12'de endolith

1
Teşekkürler, @endolith, sanırım bu gerçekten bunların hepsinin özü ve bana neden ilk düşündüğüm kadar büyük bir sorun olmadığını açıklıyor.
bryhoyt

Öyleyse, 10 tutarlı olmayan kaynak 10 dB verirse, sqrt (kaynak sayısı) ile bölmek makul bir sezgisel mi olur? Yani, 3 kaynağınız varsa, bunları toplayın ve sqrt (3) ile bölün. (eski bir konu hakkında yorum yaptığın için üzgünüm)
nerdfever.com

@ nerdfever.com RMS seviyeleri bu şekilde birleşiyor, yani ... muhtemelen?
endolith

6

formül

result=A+BAB

dışında bir şey ifade ediyor olsanız bile, hiçbir anlam ifade etmiyor . Düşünmeniz gereken bir şey, sesin sıfırın üstünde ve altında değişmesidir. Bunu düşünmenin daha iyi bir yolu şöyle:AB=AB

result=g(A+B)

burada .g1

En basit yaklaşım, muhafazakar, doğrusal ve her zaman işe yarayan ancak istediğiniz kadar "yüksek" olmayabilir, demek . "Genellikle işe yarar" ve "yüksek sesle" olan daha az muhafazakar bir yaklaşım, . Bu yaklaşımla daha fazla kanalın genişletilmesi daha iyi sonuç verir.g=0.5g=1/2

Alternatif olarak, zaman içinde değişebilir, bu durumda genellikle bir kompresör / sınırlayıcı algoritması sonucudur. O zaman gerçekten bir fark denklemin var:g

result[i]=g[i](A[i]+B[i])

g[i] , önceki , , ve .ABgresult

Belki bu:

g[i]=f(A[i]+B[i],g[i1])

GÜNCELLEME: Hotpaw2 tarafından önerildiği gibi, giriş sinyalini geciktirebilir, ancak kazanç bastırma işlemini geciktiremezsiniz. Buna "ileriye dönük bir sınırlayıcı" denir.


"AB" ile "A * B" demek istiyorum. Genliğin ya pozitif ya da negatif olabileceğini anlıyorum. Haklısın, denklemim negatif genlikleri içeren kombinasyon için pek mantıklı değil.
bryhoyt

8 ila 10 (N) farklı sinüs dalgasını karıştırmam gerekiyor. Ampirik olarak doğru değerin 0.3 ... 1 / 1√ olduğunu biliyordum.
Zibri

5

Bunun bir yolu, gerçek genli olmayan bir karışım için, ileriye dönük bir AGC kullanmak için yapılabilir; burada bir veya iki kanalın kazancı, toplam genlik kırpma sınırını aşmadan önce algılanması zor bir oranda azaltılır. Daha az ileri görüşlü olan, AGC kazanç ayarlaması daha duyulabilir hale gelecek veya daha yumuşak bir kazanç ayarlaması rampası için maksimum kazanç, limit başına kanal başına 0,5'e yaklaşacak ve yaklaşacaktır. Tahmin edilebilirliği olan ses kaynakları için zarfın zaman içindeki davranışına ilişkin bir kazanç limiti uyarlanabilir olarak tahmin etmek, ancak bazı başarısızlık olasılıkları (ani bir AGC kazanç ayarlaması olur) ile ilgili istatistikleri kullanmak da mümkündür.


Bu ileriye dönük bir sınırlayıcı, ileriye dönük bir AGC değil.
Bjorn Roche

2
@BjornRoche: Bir sınırlayıcı bir tür AGC olarak kabul edilemez mi?
Endolith

Bazı sınırlayıcılar AGC'lerdir, ancak bir göz alıcı sınırlayıcı bir AGC değildir.
Bjorn Roche

1
@BjornRoche iyi otomatik ve kontrol kazanç ...
Olli Niemitalo 13:16

2

1990'ların sonundan ve ilk 2000'lerin dijital dalgada devam eden bir karıştırıcı tasarımcısıyla konuştum (ipucu verdikten sonra). Adamın SPL için bir tasarımcı olduğunu düşünüyorum, ama belki de o kadar büyük değil, kesinlikle ne adını ne de markasını hatırlamıyorum, sadece makinenin ne kadar büyük ve pahalı olduğunu hatırlıyorum.

Uzun konuştuk ve nihayet bir araya getirilen 64/128 @ 24 bit kanallarının kırpmadan 24 bitlik doğru bir karışık çıktı kanalı olarak kaldıklarını garanti altına almak için kullanılan teknikler hakkında konuştuk.

Açıkladığı teknik oldukça basitti. 64 parça (24 bit üzerinde), kırpma işleminin gerçekleşemediği 48 bit bir kanalda eklenmiştir. Düz.

Bu sinyalin 48'den 24 bite nasıl geri döndürüldüğünü söyleyemem. Belki de zor mutfak tariflerinin uygulandığı yer orasıdır.

Ve belki de bunu başarmak için bir çok teknik var, her şeyden önce gerçek zamanlı olarak mı yoksa hayal edilmesi gereken her türlü normalleşmeyi belirlemek için basit, yüksek tepelerle kaydedilmiş olan tüm sinyallerle…


2

Global hacmi azaltın. Darbe izleyici, varsayılan olarak maksimum% 33 hacimde kanalları klasik olarak verir.

Bu, hem birkaç kanallı (4 kanallı Amiga MODs) müzik için yeterince yüksek, hem de 50 kanallı şarkılar için yeterince yumuşak görünüyor (çünkü kanal içerikleri tipik olarak birbiriyle ilişkilendirilmediğinden ses seviyesi belli bir seviyeyi geçemez ... artı birkaç kanal, bu kadar çok şey olduğu için maksimum ses seviyesinde çıkacaktır). Ayrıca, sert-sol veya sert-sağa panlanmış kanallar için (aralıkların% 66'sını kullanan) yeterli boşluk bırakıyor.

Ayrıca kanallarınızı 16 bitte bir araya getirmek istemezsiniz, bunları 32 bitte bir araya getirmek istersiniz, sonra sonucu kırpın ve en sonunda 16 bit'e düşürün. Daha yüksek aralığa ihtiyacınız olacak, böylece matematik yaparken etrafını sarmayacak. Başka bir seçenek de (bit filtreleri, efektleri vb. Yapmak için uygun olan) 32 bit kayan nokta kullanmaktır.


0

Anahtarın 16 bitlik bir değere sahipseniz ve potansiyel olarak maksimum değerden daha büyük olabilecek 2 değer eklemeniz durumunda 2 seçeneğiniz olduğunu düşünüyorum:

1) her ikisini de 32 bitlik eklentiye dönüştürün, ardından ekleme bu değeri aşıyorsa maksimum değeri döndürün. Sonra 16 bite geri attı. Örneğin, değerleriniz 32768 ve 34567 ise, 65535'i geçiyorsa ve anahtar 65535'i döndürüyorsa. Minimum değer sonunda işaretli değerleri kullanıyorsanız aynı şeyi yaparsınız.

2) her iki değeri de sıkıştırın, ardından bunları birlikte ekleyin.

Birincisi temelde sert kırpma, ikincisi yumuşak kırpmadir. Analog sistemler zor durumda.


0

Her iki izdeki frekanslar aynı uzay frekansını akıllıca alırsa, yalnızca iki kat boşluk olacaktır. Her ses için frekans spektrumunun alanlarını oyup çıkararak ve seslerin geçici ve susuzluklarını kontrol ederek her şeyin gerektiği yerde çıkması için eşittir ve sıkıştırmayı kullanın. Belki de bu soruyu cevaplamaz. Düşük frekanslı sinyalleri 2 ms'ye kadar geciktirebilirsiniz. Dalga boyu yüksek frekanslardan daha uzun olduğu için geçici olarak iptal edilmeyecek ve geçici olarak güç aç bas sinyalleriyle tam zamanında olmadığı için boşluk ekleyecektir. Doğrusal olarak daha fazla gecikme ekleyen bir şey, sinyal ne kadar düşükse test etmek ilginç olacaktır.


-1
A + B + {
    (|A| = A) = (|B| = B) = true: -AB;
    (|A| = A) = (|B| = B) = false: AB;
    else: 0
}

Yani, hem A hem de B bir işareti paylaşıyorsa, sınırlayıcı bir denge uygulayın. Ofsetin büyüklüğü, A ve B'nin ürünüdür. Ofsetin yönü, A ve B'nin tersidir.

A ve B bir işareti paylaşmıyorsa, taşmanın bir yolu olmadığından hiçbir limit uygulanmaz.


Bunun değişmeli olmadığını unutmayın. 2'den fazla ses karıştırmak istiyorsanız, hepsini bir kerede karıştırmanız gerekir. Bu durumda, her şeyi bir yönde "düzleştirmelisiniz" (eğer çok yüksekseniz, pozitif değerleri negatif olanlarla düzleştirin; eğer çok düşükseniz, negatif değerleri pozitif olanlarla düzleştirin). Ofseti hesapladıktan sonra (kalan değerler arasında orantılı olarak uygulanır); İkili yaklaşımı kullanın, ancak sınırlayıcıyı karışık değerlerin sayısına göre ölçeklendirin.
Rich Remer

-1

Benim önerim:

  1. 16bit sabit noktadan 32bit kayan noktaya parça ses formatını dönüştürün.
  2. Karıştırılacak tüm parçaların geçerli örnek değerini ekleyin.
  3. Başka bir şey yapma.

Kullanıcı, bu karışık akışı, 16bit sabit nokta formatına taklit ve geri dönüştürmeden önce sıkıştırma ve / veya sınırlama ile işlemeyi isteyebilir (bu dönüşümün ... ustalık mühendislerine dağıtılmasının genellikle daha yüksek bir çözünürlük biçiminde bırakılacağı varsayılarak).


2
Merhaba ve DSP.se'ye hoş geldiniz. Katkıda bulunduğunuz için teşekkür ederiz, ancak bu OP'nin sorusunu yanıtlıyor gibi hissetmiyorum. OP, sisteminin "kullanıcılarından" bahsetmedi: kendisi ile oynuyor ya da programı belirli şartlara göre yazıyor olabilir. Oy vermeyi reddettiğim için üzgünüm: Cevabınızı daha fazla noktaya getirirseniz, oyumu gözden geçirmekten mutluluk duyarım. Ayrıca, lütfen biçimlendirmenize dikkat edin: nasıl iyi cevaplar yazabileceğinizi görmek için SSS bölümüne bakın.
penelope
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.