我正在实现一个 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/