7

誰かが iPhone SDK でトーンを生成する方法に出くわしたかどうか疑問に思っています。DTMF トーンを生成しようとしていますが、実質的なものが見つからないようです。トーンを再生する時間も指定できるようにしたい (つまり、ボタンを短く押すのではなく、ボタンを押したままにすることをシミュレートする..

iPhreak というオープン ソース アプリを見つけました。公衆電話をだますために DTMF トーンを生成すると思われます (これは私の意図ではありません。私の会社は電話ベースのインターコム システムを扱っています)。そのアプリケーションの唯一の問題は、オープン ソース プロジェクトにないファイルがあることです。おそらく、他の誰かが過去にこのプロジェクトを機能させたことがありますか?

誰かが私がこのようなものを探す場所について何か考えを持っているなら、私は私の投票に非常に感謝しています:)

4

3 に答える 3

5

自分自身を生成するのに十分簡単でなければなりません。ハードウェアが44.1kHzでpcmバッファ(16ビットサンプル)を再生できることを考えると(これは確かにいくつかのライブラリ関数または他の関数で可能です)、波形の計算だけが残ります。

 const int PLAYBACKFREQ = 44100;
 const float PI2 = 3.14159265359f * 2;

 void generateDTMF(short *buffer, int length, float freq1, float freq2)
 {
      int i;
      short *dest = buffer;
      for(i=0; i<length; i++)
      {
           *(dest++) = (sin(i*(PI2*(PLAYBACKFREQ/freq1))) + sin(i (PI2*(PLAYBACKFREQ/freq2)))) * 16383;
      }
 }

16383は、アディティブシンセシス(正弦波を足し合わせるだけ)を使用しているために実行されます。したがって、最大結果は-2.0-2.0です。したがって、16383を掛けると、多かれ少なかれ最大16ビットの結果が得られます。-32768-+32767

編集:2つの頻度は、ウィキペディアの記事からの頻度であり、他の人がリンクしていると回答しました。2つの固有の周波数がDTMFサウンドを作成します

于 2009-09-09T14:05:18.250 に答える
5

簡単な答えは次のとおりです。

soundArray = [[NSArray alloc] initWithObjects: 
    [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-0.caf"] autorelease],
    [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-1.caf"] autorelease],
    [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-2.caf"] autorelease],
    [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-3.caf"] autorelease],
    [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-4.caf"] autorelease],
    [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-5.caf"] autorelease],
    [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-6.caf"] autorelease],
    [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-7.caf"] autorelease],
    [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-8.caf"] autorelease],
    [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-9.caf"] autorelease],
    [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-0.caf"] autorelease],
    [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-pound.caf"] autorelease],
    [[[SoundEffect alloc] initWithContentsOfFile: @"/System/Library/Audio/UISounds/dtmf-star.caf"] autorelease],
              nil];

そこにあります。標準的な電話機のキーパッドのすべてのサウンドを、すぐに楽しむことができます。

于 2009-10-13T04:03:39.170 に答える
1

迅速な DTMF サウンド

私は PCM データの生成を実験していて、Swift でこれを思いつきました。この関数[Float]は、オーディオ サンプルである を生成します。で遊べますAVAudio

DTMFは、トーンのペア、マーク長 (250 ms)、スペース長 (250 ms) で構成され、もちろんサンプル周波数 (8000 Hz) を指定する必要があります。マークとスペースは、私が標準的なヒューマン ダイヤリングと呼ぶ場合、通常約 250 ミリ秒です。サンプル周波数で遊ぶのは楽しいですが、最高周波数の 2 倍にする必要があります。楽しみのために、それをその下にドロップして、何が起こるかを聞くことができます。

public static func generateDTMF(frequency1 frequency1: Float, frequency2: Float, markSpace: MarkSpaceType, sampleRate: Float) -> [Float]
{
    let toneLengthInSamples = 10e-4 * markSpace.0 * sampleRate
    let silenceLengthInSamples = 10e-4 * markSpace.1 * sampleRate

    var sound = [Float](count: Int(toneLengthInSamples + silenceLengthInSamples), repeatedValue: 0)
    let twoPI = 2.0 * Float(M_PI)

    for i in 0 ..< Int(toneLengthInSamples) {
        // Add first tone at half volume
        let sample1 = 0.5 * sin(Float(i) * twoPI / (sampleRate / frequency1));

        // Add second tone at half volume
        let sample2 = 0.5 * sin(Float(i) * twoPI / (sampleRate / frequency2));

        sound[i] = sample1 + sample2
    }

    return sound
}

完全な Playground はGitHubからダウンロードできます。

于 2016-04-30T20:37:00.353 に答える