首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超强动力SDK -实时过滤器

超强动力SDK -实时过滤器
EN

Stack Overflow用户
提问于 2018-02-13 20:01:08
回答 2查看 471关注 0票数 0

我的目标是做一个应用程序,从麦克风捕获音频,然后将其传递给带通滤波器,并乘以一些增益,然后输出结果实时到扬声器

因此,我已经编辑了FrequencyDomain.cpp示例在Superpowered中,以符合我的目的,我尝试了这段代码,但我听不到输出的音频,我的代码中缺少什么?

代码语言:javascript
复制
static SuperpoweredFrequencyDomain *frequencyDomain;
static float  *inputBufferFloat;

// This is called periodically by the media server.
static bool audioProcessing(void * __unused clientdata, short int 
*audioInputOutput, int numberOfSamples, int __unused samplerate) {
// Creating the filter.
SuperpoweredFilter *filter = new 
SuperpoweredFilter(SuperpoweredFilter_Resonant_Lowpass, samplerate);
filter->setResonantParameters(1000.0f, 0.1f);
filter->enable(true);
filter->process(stereoBuffer, stereoBuffer, numberOfSamples);
SuperpoweredShortIntToFloat(audioInputOutput, inputBufferFloat, (unsigned int)numberOfSamples); // Converting the 16-bit integer samples to 32-bit floating point.       
}
extern "C" JNIEXPORT void 
Java_com_superpowered_frequencydomain_MainActivity_FrequencyDomain(JNIEnv * 
__unused javaEnvironment, jobject __unused obj, jint samplerate, jint buffersize) {


inputBufferFloat = (float *)malloc(buffersize * sizeof(float) * 2 + 128);

SuperpoweredCPU::setSustainedPerformanceMode(true);
new SuperpoweredAndroidAudioIO(samplerate, buffersize, true, true, audioProcessing, NULL, -1, SL_ANDROID_STREAM_MEDIA, buffersize * 2); // Start audio input/output.
}
EN

回答 2

Stack Overflow用户

发布于 2018-02-15 01:33:13

不要在音频处理回调中创建过滤器。正如您在上面的注释中所看到的,它由媒体服务器(操作系统的音频堆栈)定期调用。

只有filter->process()应该在音频处理回调内部。

您听不到音频输出,因为音频处理回调中的其余代码是无意义的。

麦克风输入到达"audioInputOutput“数组。您需要先使用SuperpoweredShortIntToFloat将其转换为浮点数据。然后你需要用你的过滤器来处理这些数据。最后,使用SuperpoweredFloatToShortInt将数据转换回short int。这只有3行代码。

票数 2
EN

Stack Overflow用户

发布于 2018-02-16 01:05:27

我设法通过像这样编辑frequencyDomain示例来解决这个问题

代码语言:javascript
复制
static bool audioProcessing(void *clientdata, short int *audioIO, int numberOfSamples, int __unused samplerate) {
SuperpoweredShortIntToFloat(audioIO, inputBufferFloat, (unsigned int)numberOfSamples);
return ((FrequencyDomain *)clientdata)->process(audioIO, (unsigned int)numberOfSamples);
 }
 FrequencyDomain::FrequencyDomain(unsigned int samplerate, unsigned int buffersize)  {

audioSystem = new SuperpoweredAndroidAudioIO(samplerate, buffersize, true, true, audioProcessing, this, -1, SL_ANDROID_STREAM_MEDIA, buffersize * 2);
}

bool FrequencyDomain::process(short int *output, unsigned int numberOfSamples) {

filterHighpass->enable(true);
filterHighpass->process(inputBufferFloat, outputBufferFloatHigh, numberOfSamples);
filter = new SuperpoweredFilter(SuperpoweredFilter_Resonant_Lowpass, numberOfSamples);
filter->setResonantParameters(200.0f, 0.1f);
filter->enable(true);
filter->process(inputBufferFloat, inputBufferFloat, numberOfSamples);

SuperpoweredFloatToShortInt(inputBufferFloat, output, numberOfSamples);

return true;
}
static FrequencyDomain *example = NULL;
extern "C" JNIEXPORT void Java_com_superpowered_frequencydomain_MainActivity_FrequencyDomain(JNIEnv * __unused javaEnvironment, jobject __unused obj, jint samplerate, jint buffersize) {

inputBufferFloat = (float *)malloc(buffersize * sizeof(float) * 2 + 128);

SuperpoweredCPU::setSustainedPerformanceMode(true);

example=new FrequencyDomain((unsigned int)samplerate, (unsigned int)buffersize);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48766363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档