我正在实现一个android FFT吉他调谐器。在这里,我有两个文本视图,一个用于显示来自麦克风端口的声音的频率,另一个用于显示音调符号。为了与频率匹配,我编写了一个if条件,其中约有35个if else条件,由150行(大约)组成。现在,当听到声音时,频率文本视图中的值将被更新,但音符音调文本视图的更新为时已晚,因为在更新文本视图之前有太多的条件要检查,因此当检查这些条件时,频率文本视图可能再次更改并自我更新。我能做些什么来摆脱这个问题呢?最后的输出不是efficient..Please帮助我...
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");
}发布于 2012-03-27 10:38:49
我的答案有以下假设:
根据基音到频率的映射关系,可以将其分为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,并且每个都包含一个地图搜索。
==================================================================================
你可以尝试的另一件事是:
尝试以500ms (或某个合理的值)的采样提供频率,而不是实时输入。这是为了防止UI线程更新中的拥塞。
==================================================================================
再说一次,我不是一个音乐爱好者。这都是基于编程的观点。不确定它是否对你有帮助。
https://stackoverflow.com/questions/9865647
复制相似问题