RMS ile bir parçanın ses şiddetini alma


15

Arabellekte sakladığım ses parçasının ses şiddetini hesaplamaya çalışıyorum. Tampon, sinyalin PCM verilerini içerir ve Kök Ortalama Karesi kullanarak ne kadar yüksek olduğunu almak istiyorum. Frekans alanına geçmek zorunda kalmadan bunu zaman alanında yapabileceğimi varsayıyorum. Bunu yapmak için sözde kod ne olurdu?

Sadece bir saniye (ses [0] - ses [44099], ses [44099] - ses [88199] vb.) İçin örnek alıp bu değerlerin RMS'sini hesaplayabilir miyim? Örneğin, bunu yapabilir miyim:

RMS=audio[0]2+audio[1]2+audio[2]2.....audio[44099]244100

her saniye için?


1
Yukarıdaki ifadede eksik bir parantez var - kendim ekleyeceğim, ancak düzenlemelerin görünüşte en az 6 karakter olması gerekiyor ...
Paul R

3
@PaulR - <!-- html comment -->Aksi takdirde mükemmel bir gönderinin küçük ama çok önemli bir hataya sahip olduğu nadir durumlarda karakter kısıtlaması etrafında bir çözüm ekleyebilirsiniz . Bu ihtiyaç çok nadir görülür: genellikle 6'dan fazla iyileştirme karakteri vardır. Örneğin, eksik parantez olduğunda , TeX içinde \sqrt{}ve \frac{}{}yapılarını kullanmak genellikle daha iyidir .
Kevin Vermeer

1
@Kevin: bahşiş için teşekkürler - HTML yorum önerinizi gelecekte kullanacağım.
Paul R

@PaulR - Bu daha önce tartışılmıştır: Kısıtlama kasıtlıdır, eksik veya anlamsız düzenlemeleri önlemek için tasarlanmıştır ( burada bir savunmaya bakın ), ancak rakipleri var ( buradaki tartışmaya bakın ).
Kevin Vermeer

4
Sadece RMS'nin size ses yüksekliği olmadığını unutmayın. Son derece düşük veya yüksek frekanslar ses olarak aynı RMS değerinin 3 kHz'inden daha düşük ses çıkarır. A ağırlıklandırma filtresi size daha doğru bir tahmin sağlayacaktır. gist.github.com/148112
Endolit

Yanıtlar:


12

Başka bir şey, RMS değerinin algılanan ses yüksekliği ile çok iyi ilişkili olmamasıdır. Bunun yerine seviye veya ses seviyesi olarak adlandırmayı düşünebilirsiniz. Kulağın başka bir frekansa kıyasla belirli bir frekansa ne kadar duyarlı olduğunu ölçen eşit ses yüksekliği konturları denen bir şey var, Wikipedia makalesine bakın . Bu eğriler düzeye bağımlıdır. Örneğin, kulak bu görüntüde gösterildiği gibi 100Hz tona kıyasla 1kHz tona çok duyarlıdır (yatay eksen Hz cinsinden frekanstır):

eşit ses yüksekliği konturları

Yapabileceğiniz görece basit şeylerden biri, PCM verilerinizi ters eşit ses yüksekliği eğrisiyle filtrelemektir. Veya standart A ağırlığını uygulayabilirsiniz, Wikipedia Ağırlık Filtresi makalesine bakın . Ardından, eşit ses ağırlıklı filtrenin çıkışının RMS değerini hesaplayabilirsiniz.


Quesitoner'in kodundan buna nasıl gidileceğimi bilmiyorum. Sorunun örneği, ses örneklerinin karelerini toplamaktır. Yanıt, frekanslara filtre uygulamaktan bahsediyor, bu yüzden "PCM verilerinizi ters bir ses şiddeti eğrisiyle filtreleyin" yeterli görünmüyor. Önce her bir frekans için değere sahip olmanız gerekir, sonra eğrinin nasıl doğru uygulanacağını anlayabilirsiniz? Ama bu büyük bir adım kaldı.
gman

@gman Fikir, sesi bir filtreyle önceden işlemek ve ardından sonucu soruda olduğu gibi kullanmaktır (RMS hesaplama). Ne demek istediğinden% 100 emin değilim. Filtrelemenin veya belki de filtre tasarımının nasıl yapılacağından emin değil misiniz?
niaren
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.