生成DTMF音调

时间:2009-09-09 12:51:32

标签: iphone generator dtmf

我想知道是否有人遇到过在iPhone SDK中生成音调的方法。我试图生成DTMF音调,似乎找不到任何实质性的东西。我希望能够指定播放音调的时间长度(即模拟按住按钮而不是简单地按下按钮..

我找到了一个名为iPhreak的开源应用程序。它应该产生DTMF音调来欺骗付费电话(我向你保证这不是我的意图 - 我的公司处理基于电话的内部通信系统)。该应用程序的唯一问题是开源项目中缺少文件。也许其他人已经让这个项目在过去工作了?

如果有人知道我会在哪里找到这样的东西,我会非常感谢我的投票:)

3 个答案:

答案 0 :(得分:5)

应该很容易自己生成。 鉴于硬件可以播放44.1 khz的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个常见的是来自维基百科文章的频繁,其他人回答链接。两个独特的频率产生DTMF声音

答案 1 :(得分: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];

你有它。标准电话键盘的所有声音,阵列中,准备好您的享受。

答案 2 :(得分:1)

Swift DTMF声音

我正在尝试生成PCM数据,并在Swift中提出了这个问题。此函数将生成[Float]个音频样本。您可以使用AVAudio播放它们。

每个DTMF由一对音调,标记长度(250 ms),空间长度(250 ms)组成,当然您需要指定采样频率(8000 Hz)。对于我称之为标准的人体拨号,Mark and Space通常约为250毫秒。采样频率很有趣,但需要是最高频率的两倍。为了好玩,您可以将其放在下方,以了解会发生什么。

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
}

可以在GitHub上下载完整的Playground。