首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高性能

提高性能
EN

Stack Overflow用户
提问于 2012-03-26 09:38:16
回答 1查看 117关注 0票数 0

我正在实现一个android FFT吉他调谐器。在这里,我有两个文本视图,一个用于显示来自麦克风端口的声音的频率,另一个用于显示音调符号。为了与频率匹配,我编写了一个if条件,其中约有35个if else条件,由150行(大约)组成。现在,当听到声音时,频率文本视图中的值将被更新,但音符音调文本视图的更新为时已晚,因为在更新文本视图之前有太多的条件要检查,因此当检查这些条件时,频率文本视图可能再次更改并自我更新。我能做些什么来摆脱这个问题呢?最后的输出不是efficient..Please帮助我...

代码语言:javascript
复制
if(frequency >= 62 && frequency <= 65)
{
   note.setText("C");
}
else if(frequency >= 70 && frequency <= 74)
{
  note.setText("C#");
}
else if(frequency >= 77 && frequency <= 81)
{
  note.setText("D");
}
else
{
  note.setText("Frequency is out of range");
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-27 10:38:49

我的答案有以下假设:

  • 假设瓶颈是IF-ELSE

根据基音到频率的映射关系,可以将其分为8组。http://peabody.sapp.org/class/st2/lab/notehz/

步骤1:您可以考虑2级IF-ELSE,其中第一级用于确定组,第二级用于确定单个音调音符。以减少潜在的IF_ELSE执行量。

示例:

代码语言:javascript
复制
 if(frequency <= 31) {
   // Group 1
 } else if (frequency <= 62) {
   // Group 2
 } else if (frequency <= 124) {
   // Group 3
   if(frequency >= 62 && frequency <= 65)
   {
       note.setText("C");
   }
   else if(frequency >= 70 && frequency <= 74)
   {
       note.setText("C#");
   }
   else if(frequency >= 77 && frequency <= 81)
   {
       note.setText("D");
   }
 } etc etc

步骤2:您可以为每个组创建一个HashMap。改进了二级搜索算法。

假设组3有一个这样的HashMap:

代码语言:javascript
复制
 { 62, "C" }
 { 63, "C" }
 { 64, "C" }
 { 65, "C" }
 { 70, "C#" }
 { 71, "C#" }
 { 72, "C#" }
 { 73, "C#" }
 { 74, "C#" }

您的代码将如下所示:

代码语言:javascript
复制
 Map<Integer,String> mapGroupThree = new HashMap<Integer,String>();
 String result = "";

 if(frequency <= 31) {
   // Group 1
   result = mapGroupOne.get(frequency);
 } else if (frequency <= 62) {
   // Group 2
   result = mapGroupTwo.get(frequency);
 } else if (frequency <= 124) {
   // Group 3
   result = mapGroupThree.get(frequency);
 } etc etc

 textView1.setText(result==null?"Out of Range":result);

因此,最后,您将有8个IF-ELSE,并且每个都包含一个地图搜索。

==================================================================================

你可以尝试的另一件事是:

尝试以500ms (或某个合理的值)的采样提供频率,而不是实时输入。这是为了防止UI线程更新中的拥塞。

==================================================================================

再说一次,我不是一个音乐爱好者。这都是基于编程的观点。不确定它是否对你有帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9865647

复制
相关文章

相似问题

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