DTMF码(Generate DTMF Tones)

2019-08-04 12:40发布

如果有人碰到过的方法来生成在iPhone SDK的色调我不知道。 我想产生DTMF音,似乎无法找到任何实质性那里。 我希望能够指定多久打基调,以及(即模拟按住该按钮,而不是仅仅按下它简单..

我发现叫iPhreak一个开源的应用程序。 它理应产生双音多频傻瓜付费电话(我向你保证,这不是我的本意 - 我公司涉及基于电话对讲系统)。 与该应用程序的唯一问题是,有来自开源项目丢失的文件。 也许别人已经得到了这个项目在过去的工作?

如果任何人有我会找这样的事情,其中​​的任何想法,我将非常感激我的票:)

Answer 1:

应该很容易产生自己。 考虑到硬件可以在44.1千赫(其中就一定能与一些库函数或其他),你只剩下计算波形回放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个frequenties是从维基百科的文章谁接链接到其他人的frequenties。 两个不同的频率进行DTMF声音



Answer 2:

最简单的答案是这样的:

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];

你有它。 一个标准的手机键盘的所有的声音,在一个阵列,准备好您的享受。



Answer 3:

斯威夫特DTMF声音

我与生成PCM数据实验和斯威夫特这个走了过来。 此功能将产生一个[Float]其为音频样本。 你可以发挥他们AVAudio

每个DTMF由一对音调,标记长度(250毫秒),一个空格长度(250毫秒)的,当然需要指定一个采样频率(8000赫兹)。 马克和空间通常是为我所说的标准人体拨号大约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上 。



文章来源: Generate DTMF Tones