サウンドファイルの速度を変更したいと思っていますが、それを実現する方法がわかりません。速度を落とす場合は、ある種の補間を行う必要があると思いますが、速度を上げる方法がわかりません。おそらく、いくつかのサンプルの平均ですか?テンポやピッチが変わるかどうかは今のところ問題ではありませんが、両方を達成する方法を学びたいのですが、少なくともどちらか一方を達成したいと思います。
誰かがこれらのタイプの操作の背後にある数学への参照を持っているなら、彼らは大いに感謝されるでしょう!
ありがとう、ベン
サウンドファイルの速度を変更したいと思っていますが、それを実現する方法がわかりません。速度を落とす場合は、ある種の補間を行う必要があると思いますが、速度を上げる方法がわかりません。おそらく、いくつかのサンプルの平均ですか?テンポやピッチが変わるかどうかは今のところ問題ではありませんが、両方を達成する方法を学びたいのですが、少なくともどちらか一方を達成したいと思います。
誰かがこれらのタイプの操作の背後にある数学への参照を持っているなら、彼らは大いに感謝されるでしょう!
ありがとう、ベン
サウンドファイルの再生を高速化するには、次の2つのオプションがあります。
これらの方法のいずれにおいても、再生速度を上げると、それに応じて音の高さが変化します。
サンプルレートを上げる
サンプルレートを上げると、サウンドの再生速度が上がります。たとえば、22KHzのサンプリングレートから44KHzに変更すると、再生サウンドは元のサウンドの2倍の速さになります。この方法では、元のサンプリングデータは変更されません。変更する必要があるのはオーディオ再生設定のみです。
単位時間あたりのサンプル数を減らす
この方法では、再生サンプリングレートは一定に保たれますが、サンプル数が減り、一部のサンプルがスローされます。
サウンドの再生を元の速度の2倍にするという単純なアプローチは、1つおきのサンプルを削除し、元の再生サンプリングレートで再生することです。
ただし、このアプローチでは、一部の情報が失われ、一部のアーティファクトがオーディオに導入されることが予想されるため、これは最も望ましいアプローチではありません。
自分で試したことはありませんが、サンプルを平均して新しいサンプルを作成するというアイデアは、最初から良いアプローチです。これは、音声情報を単に捨てるのではなく、平均化プロセスによってある程度「保存」できることを意味しているように思われます。
プロセスの大まかなアイデアとして、再生速度を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)
また、「プログラマティックオーディオ入門」という質問への回答も投稿しました。ここでは、実行可能な基本的なオーディオ操作について詳しく説明しました。これも興味深いかもしれません。
ウィキペディアにはサンプルレート変換についての良い説明があります。基本的に、信号を2つのサンプルレートの最小公倍数に変換し、ターゲットサンプルレートに適合しない(またはソースから取得されなかった)周波数をフィルターで除外し、ターゲットサンプルレートで新しいサンプルを選択します。計算にかかるリソースを大幅に減らす(多相分解)ための数学的トリックがありますが、これで始めることができます。