java - 提高性能

标签 java android

我正在实现一个 Android FFT 吉他调音器。在这里,我有 2 个 TextView ,1 个用于显示来自麦克风端口的声音的频率,另一个用于显示音高符号。为了与频率相匹配,我编写了一个 if 条件,该条件大约有 35 个 if else if 条件,由 150 行(大约)组成。现在,当听到声音时,频率 TextView 中的值会更新,但音符音高 TextView 的更新会很晚,因为在更新 TextView 之前需要检查很多条件,因此当检查条件时,再次,频率 TextView 可能已更改并自行更新。我该怎么做才能摆脱这个问题?最终输出效率不高..请帮我解决这个问题...

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");
}

最佳答案

我的回答有以下假设:

  • 假设您的瓶颈是 IF-ELSE

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

第 1 步: 你可以考虑2级IF-ELSE,第一级是确定组,第二级是确定单个音调。减少执行 IF_ELSE 的潜在数量。

示例:

 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:

 { 62, "C" }
 { 63, "C" }
 { 64, "C" }
 { 65, "C" }
 { 70, "C#" }
 { 71, "C#" }
 { 72, "C#" }
 { 73, "C#" }
 { 74, "C#" }

您的代码将类似于以下内容:

 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,每个包含 1 个 map 搜索。

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

您可以尝试的另一件事:

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

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

再说一遍,我不是音乐人。这一切都是基于编程的角度。不知道对你是否有帮助。

关于java - 提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9865647/

相关文章:

java - 在自定义域 URL 地址上公开 appengine 云端点 api

java - 如何更有效地处理错误?

java - 如何修复ORA-01008 : Not all variables bound

java - 为什么 'For each' 不在 Java 中未初始化的数组上循环

java - 我在 lambda 表达式中找不到结果

android - 为什么 Aviary 返回按比例缩小的图像?

Android 应用内计费验证

java - Parcelable 在没有正确实现的情况下工作

android - 如何将 ZXing 库集成到 Android Studio 进行条码扫描?

java - 增强现实测量技术/方法