2012-03-26 3 views
0

Я реализовал андроид FFT гитарный тюнер. Здесь у меня есть 2 текстовых вида, 1 для отображения частоты звука, поступающего с микрофонного порта, а другой 1 для отображения нотации высоты тона. Чтобы соответствовать частоте, я написал условие if, которое имеет около 35, если 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"); 
} 
+0

Если вы хотите получить более чистый код, рассмотрите инструкцию 'switch' вместо ... – Jon

+3

Вы уверены, что это сложность if-утверждения, вызывающего медленность? Вы приурочили, сколько времени он принимает для выполнения всех условий? Если вы этого не сделали, сделайте это, прежде чем продолжить. Вы можете потратить много времени на оптимизацию фрагментов кода, которые фактически не вызывают проблем с производительностью, которые вы видите.Я говорю это по опыту :) – jacobm

+0

Является ли оператор switch быстрее, чем если условие? и я не пытался проверять время на выполнение. Но так как частота изменяется в каждую секунду (может быть, миллисекунду), я думал, что условия отсутствия: могут повлиять на создание вывода ... –

ответ

2

Мой ответ следующее предположение:

  • Если предположить, что бутылочную шею является IF-ELSE

В соответствии с отображением Pitch to Frequency его можно разделить на 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 поиск карты.

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

Другое дело, что вы можете попробовать:

Попробуйте установить частоту в выборке 500 мс (или некоторое разумное значение) вместо входа в реальном времени. Это необходимо для предотвращения перегрузки в обновлении потока пользовательского интерфейса.

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

Опять же, я не музыкальный парень. Все это основано на перспективах программирования. Не уверен, что это полезно для вас.

+0

Будет ли использование hashmap сократить время выполнения? Я имею в виду, это принесет лучшую производительность? –

+0

Об этом много дискуссий. Например. [Это] (http://www.znetdevelopment.com/blogs/2010/12/17/java-performance-map-vs-ifelse/) Но опять же, я думаю, что проблема с производительностью в вашем случае не связана с этими частями кода. Мой ответ может помочь немного, но не очень. – Calvin

+0

Вы можете попробовать поставить свою частоту с частотой дискретизации около 500 мс. Это будет UI достаточно времени для обновления экрана. – Calvin

Смежные вопросы