我想知道是否有人遇到过在iPhone SDK中生成音调的方法。我试图生成DTMF音调,似乎找不到任何实质性的东西。我希望能够指定播放音调的时间长度(即模拟按住按钮而不是简单地按下按钮..
我找到了一个名为iPhreak的开源应用程序。它应该产生DTMF音调来欺骗付费电话(我向你保证这不是我的意图 - 我的公司处理基于电话的内部通信系统)。该应用程序的唯一问题是开源项目中缺少文件。也许其他人已经让这个项目在过去工作了?
如果有人知道我会在哪里找到这样的东西,我会非常感谢我的投票:)
答案 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)
我正在尝试生成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。