0

我的目标是制作一个从麦克风捕获音频的应用程序,然后将其传递给带通滤波器并乘以一些增益,然后将结果实时输出到扬声器
,因此我在 Superpowered SDK 中编辑了 FrequencyDomain.cpp 示例以匹配我的目的,我尝试了这段代码,但我听不到输出音频,我的代码中缺少什么?

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.
}
4

2 回答 2

2

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

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

您没有听到音频输出,因为音频处理回调中的其余代码是无稽之谈。

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

于 2018-02-14T17:33:12.550 回答
0

我设法通过像这样编辑频率域示例来解决它

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);
}
于 2018-02-15T17:05:26.860 回答