2009-06-02 21 views
4

サウンドファイルの速度を変更しようとしていますが、その方法については紛失しています。私は、いくつかのタイプの補間は、速度を落とす場合に行わなければならないと仮定していますが、スピードアップを達成する方法は不明です。テンポやピッチを変えるかどうかは現時点では問題ではありませんが、どちらを達成するのかを学びたいですが、少なくともどちらか一方をやりたいと思っています。サウンドファイルの速度を変更する

これらの操作の背後にある数学に言及している人は誰でも、非常に感謝しています。

おかげで、 ベン

+1

この質問の面白いサウンドタイトルです:) –

+4

はい、私は「音の速さを変える」とほとんど読んでいます –

+0

スピード(ピッチも変わります)またはテンポ(ピッチを一定に保ちます) ? –

答えて

9

サウンドファイルの再生をスピードアップするには、2つのオプションがあります。

  • は、サンプル・レート
  • は、単位時間あたりのサンプル数を減らして増やします。

いずれの方法でも、再生速度の増加に対応して音の音程が変化します。

音の再生速度を増加させるサンプルレートを上げるサンプルレートに

を増やします。たとえば、22KHzのサンプリングレートから44KHzにすると、再生音が元の2倍の速さになります。この方法では、オリジナルのサンプリングデータは変更されず、オーディオ再生の設定だけを変更する必要があります。

この方法では、単位時間あたりのサンプル

の数を減らし、再生サンプリングレートは一定に保たれるが、サンプルの数が削減される - サンプルの一部が投げ出されます。

音の再生速度を元の2倍にする単純なアプローチは、他のすべてのサンプルを削除し、元の再生サンプリングレートで再生することです。

しかし、このアプローチでは、情報の一部が失われてしまい、オーディオにアーティファクトが導入されることが予想されるため、最も望ましいアプローチではありません。

私はそれを試したことはありませんが、サンプルを平均化して新しいサンプルを作成し、それを始めるには良いアプローチであるという考え方です。これは、単に音声情報を放棄するのではなく、平均化プロセスによってある程度まで「保存」することができるということを意味すると思われる。プロセスの目安として

が、ここで再生速度を2倍に擬似コードの一部です:

original_samples = [0, 0.1, 0.2, 0.3, 0.4, 0.5] 

def faster(samples): 
    new_samples = [] 
    for i = 0 to samples.length: 
     if i is even: 
      new_samples.add(0.5 * (samples[i] + samples[i+1])) 
    return new_samples 

faster_samples = faster(original_samples) 

私はいくつかの質問に入った「」に回答も掲載しました実行することができる基本的なオーディオ操作についての詳細なので、おそらくそれも興味深いかもしれません。

+0

私が考えることができる平均化の唯一の利点は、バイアスを最小限に抑えることです。たとえば、[1、-1,1、-1,1、-1]のようなデータがゼロバイアスの場合、平均化するとゼロバイアスが維持されますが、サンプルを廃棄することはできません。あなたが良いDSP教科書を手に取るかどうかを知るように、信号に何かをするだけで何らかのアーティファクトが導入されます。 – Nosredna

+0

@ノスレッドナ:それはバイアスについてのポイントを説明するための本当に良い例です。それを指摘していただきありがとうございます。 – coobird

3

sample rate conversionについては、ウィキペディアに良い説明があります。基本的には、信号を2つのサンプルレートの最小公倍数に変換し、ターゲットサンプルレートに適合しない(またはソースから来なかった)周波数を除外し、ターゲットサンプルレートで新しいサンプルを選択します。計算に大幅なリソース(多相分解)を取るための数学的なトリックがありますが、これはあなたを始めるはずです。

関連する問題