Frekansı Korurken Müzik Çalmayı Yavaşla


10

Bir parça müzik sesini daha düşük bir hızda çalmak ses perdesini (frekans) düşürür. Sıklığı aynı tutarken şarkıyı çalmayı yavaşlatan bir araç ve teori var mı? Birinin pencereli Fourier dönüşümü veya dalgacık dönüşümü yapabileceğini düşünüyorum. Pencere boyutunu önceden seçmek ya da dalgacık tabanını dinamik olarak seçmek zorunda gibi görünüyor. Bunu yapmak için özel ve ayrıntılı bir teori ve uygulama var mı?


1
Aşağıda verilen cevaba ek olarak, daha fazla bilgi için lütfen bu bağlantıya bakın .
A_A

Yanıtlar:


5

Evet, bazılarımız bunu yapabilir, sahayı etkilemeden hızlandırabilir veya yavaşlatabilirsiniz, bazı çocuklar bu Time Stretch uygulamalarını çağırır, bunu yapmanın farklı yolları vardır, frekans alanında veya zaman alanında yapabilirsiniz, seçmeniz gerekecek sizin için en iyi olanı, her birinin bazı avantajlarını ve dezavantajlarını bulacaksınız.

Zaman Alanı:

Time Domain'de aşağıdaki teknikleri deneyebilirsiniz:

  • TDHS (Zaman alanı Harmonik Sacaling)
  • SOLA (Senkronize Çakışma Ekleme)
  • PSOLA (Pitch Senkronize Çakışma Ekle)
  • WSOLA (Dalga Formu Benzerlik Örtüşme Ekle)

Artıları: Hızlı, bazı algoritmaları anlamak kolaydır, monofonik seslerde kaliteli.

Eksileri: Doğru pozisyonda birleştirme yapmak için çok güzel bir adım parkuruna ihtiyacınız olacak, bunu yapmak zor :-(, eğer parkur parkurunuz başarısız olursa veya Poliphonic seslerde çalışmıyorsa bu algoritmalar çok fazla aksaklık / eser verecektir çıkış sesinde.

Frekans Alanı:

Frekans alanında bildiğim tüm zaman streç faz vokoder tekniklerine dayanmaktadır .

Artıları: Polifonik veya monofonik seslerle çalışır.

Eksileri: Acı olabilir tüm matematik anlamak, uygulama biraz zor, zaman etki alanı kodları gibi çok hızlı değil, ses için ben zaman etki alanı sonuçları tercih, standart faz vocoder sonucunu artırmak için bazı hileler paylaşılmaz.

Pencere ve sekme boyutunun faz vocoder kalitesi için anahtarlardan biri olduğunu söyleyebilirim, genellikle 4xresenteze örtüşmeyi seçiyoruz , 4096kulaklarım için bir hann pencere boyutu yeterli (tabii ki bu boyutlar için işlem gücünüz varsa) , standart fazlı vocoder, fazı kilitlemeniz gereken bu tür problemlerden kaçınmak için bazı yankılanan eflattlar ekleyebilir.

Bir bakabilir datailed için Miller Puckette ve Portnoff kağıdı


Cevabınız için teşekkür ederim. Yaklaşımların en naifiyle ilgili sorun nedir: Fourier serisine girmeden tüm zaman aralığında bir fonksiyon olarak zaman sinyalini genişletin ve tüm frekansları bir sabitle çarpın. Zaman alanındaki herhangi bir yerel hatanın tüm Fourier katsayılarını etkileyeceğini anlıyorum. Bunun dışında, bu naif yerelleşmemiş yaklaşımın tuzakları nelerdir?
Hans

Hiç böyle bir şey denemedim, işe yarayabilir, bariz sorun bunun oldukça pahalıya mal olabileceğidir, kesinlikle etkili bir yol değildir, şimdi 44100Hz'de örneklenmiş bir ses parçanız (1 dakika) olduğunu hayal edin, şimdi Eğer en fourier uygulamak zorunda kalacak önerdikleri şey yok 44100 * 60 = 2646000, bu yüzden bu tür işlem gerçek zamanlı çalışan her girişime unutmak bir kez ve süreci en noktalarında bu ,
ederwander

1
Daha önce önerdiğim şeyin saf matematiksel anlamda işe yarayacağını düşünmüyorum (maliyet ve hata duyarlılığını göz ardı ederek).
Hans

3

Açıkladığınız araç / teori, müzik teknolojisinde geniş çapta ses zaman ölçeğinde değişiklik olarak adlandırılan geniş bir araştırma alanıdır. Bu alanın büyük bir bileşeni, zaman uzatma sonrasında frekanstaki sesli değişiklikleri nasıl önleyebileceğinizdir. Bu, uygulamanızın kısıtlamalarına veya hedeflerine bağlı olarak hem frekans hem de zaman alanı yöntemleriyle ele alınabilir. Ses zaman ölçeği / ses perdesi modifikasyonu için wikipedia girişi iyi bir başlangıç ​​noktasıdır.

Frekans / dalgacık tabanını kullanarak bir yaklaşım izlemek istiyorsanız, pencere boyutunuz ve taban seçiminiz sinyali ne kadar iyi yerelleştirebileceğinizi etkiler. STFT'yi örnek olarak kullanmak için, uzun bir pencere sabit sinüzoidler için iyi performans gösterir, ancak geçici durumlarınızı yok eder. Daha kısa bir pencere, frekans alanı lokalizasyonu maliyetinde tercih edilen bir geçici tepki sağlayacaktır. Diğer dalgacık tabanlarının performansı, sinyalinizin temele yansıtılmasının doğasına bağlı olacaktır.


Cevabınız için çok teşekkür ederim. Bu soruna dalgacık uygulaması hakkında herhangi bir referansınız var mı?
Hans

Lütfen aşağıdaki yorumumu ederwander'ın cevabına da bakınız. Teşekkürler.
Hans

2

Aşağıda, Stephan M. Bernsee'nin müziğini değiştirmeden yavaşlatabilen veya hızlandırabilen C ++ (smbPitchShift.cpp) 'deki basit ve değerli bir öğretici fonksiyonun bağlantısı bulunmaktadır.

Bu kodu The Wide Open License (WOL) altında yayınladı. Uygulamamda, işlevini müziği gerçek zamanlı olarak yavaşlatmaya uyarlayabildim - yani bir mp3 dosyası çalarken ve aynı zamanda bu mp3 sinyali üzerinde perde algılama yaparken.

Ayrıca müzik gibi ses sinyallerinin Zaman Esnetme ve Ses Sıkma Değişimi ile ilgili ayrıntılı açıklamalarını içeren Bernsee'nin web sitesine bir bağlantı da ekledim.

https://github.com/AndyA/BatPhone/blob/master/pitchshift.c

http://blogs.zynaptiq.com/bernsee/time-pitch-overview/


Orijinal kod geçerli değildir time stretch, orijinal kod uygulanır Pitch Shift, bu durumda birleştirmeniz gereken zaman ölçeği modifikasyonunu uygulamak için Pitch Shifit + Resample (interpolation)Bernsee'nin kodu, 4096bir oktavı (yukarıda veya aşağıda) kaydırmak için kullanabileceğiniz boyutta bir pencere kullanarak iyi çalışır buna göre, 2.0x-0.5x arasındaki faktörleri kullanarak sadece kaliteli bir zaman ölçeği yapabileceğiniz, iyi inşa edilmiş bir faz vocoder aynı pencere boyutunu kullanarak daha iyi sonuçlar elde edebileceğiniz ve bunları tahmin edebileceğiniz anlamına gelir. kalitesi daha yüksek faktörler
ederwander

Hata! Şimdi uzamayı tamamlamak için Re-Sampling uygulamam gerektiğini hatırlıyorum, böylece orijinal adım değiştirilmedi. Bernsee, GitHub'a bağlı sürümden beri kodunda bazı değişiklikler yaratmış gibi görünüyor. Onun yeni kodu web sitesinden indirilebilir - orijinal özelliklerinden kayma aralığını artırabilir. Orijinal kodunu değiştirdim, böylece 8x kadar vites değiştirebildim.
James Paul Millard

kodunuz ve Bernsee sayfası arasında hiçbir fark yoktur, ana matematik hala aynıdır, Görebildiğim güçlü fark, 8192indirme sayfasındaki kodlarda pencere boyutu = , bu yüzden işlemek için 4 kat daha fazla puan yapmanız gerekiyor , Yarım pencere boyutu 8192/2=4096ile faz vocoder bazı sırlarını kullanarak aynı şeyi yapabileceğinizi söylemek için geri gelmek , burada nokta çok daha az işleme ile kaliteyi korumak olduğunu.
ederwander

BatPhone'a GitHub bağlantısını sağlasam da, bu benim kodum DEĞİL. Ben sadece smbPitchShift () görüntüleme vermek için bir Internet arama çekti. Kodum Bernsee'nin versiyonundan çok değiştirildi ve şu dosyada saklandı
James Paul Millard

Evet, şimdi görebiliyorum, bu gerçekten bir örnek, faz ses kodlayıcıyı çalışırken görmek / duymak ilginizi çekebilir .
ederwander
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.