ios音频输出正弦波异常问题

wengjianfeng 2015-03-28 04:46:00
请教一下:使用AudioUnit输出具有时序的正弦波,具体功能为输出20KHZ XX毫秒、0KHZ yy毫秒、20K zz毫秒.....当0kHz的持续时间超过1.66ms时,接下来的正弦波就会异常(有周期性,感觉像是叠加了某个信号)具体看下图。

我的思路是,填充0KHZ进入buffer之后但没完全输出,此时20KHZ填充进来,导致buffer中的数据重叠,但不知如何处理好,请求支援,万分感谢!

-(void)initSignal//使用类似采样,从sin中提取值用于音频回调时输出。
{
for (UInt32 frame = 0; frame < 4096;) {
double dVal = sin(2 * M_PI * ((double)frame) / 4.0 / (((double)SAMPLE_RATE) / ((double)FREQUENCY)));//0
SInt16 val = (SInt16)(dVal * MAX_VALUE);//0
SInt16 valMinu = (SInt16)-val;//0
genSpace[frame] = 0;
genSignal[frame++] = (SInt8)(val & 0x00FF);
genSpace[frame] = 0;
genSignal[frame++] = (SInt8)(((UInt16)(val & 0xFF00)) >> 8);
genSpace[frame] = 0;
genSignal[frame++] = (SInt8)(valMinu & 0x00FF);
genSpace[frame] = 0;
genSignal[frame++] = (SInt8)(((UInt16)(valMinu & 0xFF00)) >> 8);
}
}

OSStatus RenderTone(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{
NSLog(@"RenderTone come in");
int audio_length = inNumberFrames;

SInt8 *buffer0 = (SInt8 *)ioData->mBuffers[0].mData;
SInt8 *buffer1 = (SInt8 *)ioData->mBuffers[1].mData;

SignalManager *signalManager = (__bridge SignalManager *)inRefCon;
NSMutableArray *array = signalManager->_signalSpaceList;
SInt8 *genSignal = signalManager->genSignal;
SInt8 *genSpace = signalManager->genSpace;

for (int i = 0; i < audio_length;)
{
if (array.count <= 0)
{ // caution: avoid array out of index
if (i < audio_length)
{
memcpy(buffer0 + i, genSpace, audio_length - i);
memcpy(buffer1 + i, genSpace, audio_length - i);
}

[signalManager pause];
break;
}
Signal *signal = [array objectAtIndex:0];

if (i + signal.length < audio_length)
{
if (signal.isSignal)
{
memcpy(buffer0 + i, genSignal, signal.length);//发送20KHZ信号
memcpy(buffer1 + i, genSignal, signal.length);
}
else
{
memcpy(buffer0 + i, genSpace, signal.length);//发送0KHZ信号,当此信号长度超过1.66ms就会造成20KHZ波形混乱
memcpy(buffer1 + i, genSpace, signal.length);
}
i += signal.length;
[array removeObjectAtIndex:0];
}
else
{
if (signal.isSignal)
{
memcpy(buffer0 + i, genSignal, audio_length - i);
memcpy(buffer1 + i, genSignal, audio_length - i);
}
else
{
memcpy(buffer0 + i, genSpace, audio_length - i);
memcpy(buffer1 + i, genSpace, audio_length - i);
}
signal.length -= (audio_length - i);
break;
}
}

//NSLog(@"RenderTone go out");

return noErr;
}
...全文
524 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
想游泳的鱼 2017-06-16
  • 打赏
  • 举报
回复
问题解决了吗? 我也碰到这个问题了,你有demo可以参考吗?
donny2g2015 2015-04-02
  • 打赏
  • 举报
回复
请教下楼主是怎么控制20KHZ XX毫秒、0KHZ yy毫秒、20K zz毫秒,中间的XX毫秒的?
Bannings 2015-04-01
  • 打赏
  • 举报
回复
引用 7 楼 wengjianfeng 的回复:
引用 6 楼 zhangao0086 的回复:
引用 5 楼 wengjianfeng 的回复:
[quote=引用 4 楼 wengjianfeng 的回复:] [quote=引用 3 楼 zhangao0086 的回复:] 唉。。没搞过音频。。。
没事,一起学习!
其实我严重怀疑是由于memcpy拷贝过程中,音频还没完全输完,然后新的来了,导致信号叠加。但我完全不知如何处理好!
那你是不是要搞个队列?然后挨个copy?[/quote]恩,我再研究一下音频的队列,搞出来分享给大家![/quote]
wengjianfeng 2015-03-31
  • 打赏
  • 举报
回复
引用 6 楼 zhangao0086 的回复:
引用 5 楼 wengjianfeng 的回复:
引用 4 楼 wengjianfeng 的回复:
[quote=引用 3 楼 zhangao0086 的回复:] 唉。。没搞过音频。。。
没事,一起学习!
其实我严重怀疑是由于memcpy拷贝过程中,音频还没完全输完,然后新的来了,导致信号叠加。但我完全不知如何处理好!
那你是不是要搞个队列?然后挨个copy?[/quote]恩,我再研究一下音频的队列,搞出来分享给大家!
Bannings 2015-03-31
  • 打赏
  • 举报
回复
引用 5 楼 wengjianfeng 的回复:
引用 4 楼 wengjianfeng 的回复:
引用 3 楼 zhangao0086 的回复:
唉。。没搞过音频。。。
没事,一起学习!
其实我严重怀疑是由于memcpy拷贝过程中,音频还没完全输完,然后新的来了,导致信号叠加。但我完全不知如何处理好!
那你是不是要搞个队列?然后挨个copy?
wengjianfeng 2015-03-31
  • 打赏
  • 举报
回复
引用 4 楼 wengjianfeng 的回复:
引用 3 楼 zhangao0086 的回复:
唉。。没搞过音频。。。
没事,一起学习!
其实我严重怀疑是由于memcpy拷贝过程中,音频还没完全输完,然后新的来了,导致信号叠加。但我完全不知如何处理好!
wengjianfeng 2015-03-31
  • 打赏
  • 举报
回复
引用 3 楼 zhangao0086 的回复:
唉。。没搞过音频。。。
没事,一起学习!
wengjianfeng 2015-03-30
  • 打赏
  • 举报
回复
哪位大哥给点提示吧!
Bannings 2015-03-30
  • 打赏
  • 举报
回复
唉。。没搞过音频。。。

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧