2014-07-21 3 views
0

실시간 피치 감지를위한 프로그램을 작성 중입니다. pitch_energy > threshold 언젠가조건이 잠시 동안 false로 유지되면 파이썬이 깨집니다.

에 대한 False 경우

def pitch_detection : 

    result = [] 
    while True : 

     // apply pitch detection algorithm 

     if pitch_energy > threshold : 
      result.append(pitch) 

    return result  

내가 루프에서 brrak 할 내가 지금 뭐하는 거지 것은 언젠가 한 후 제한 시간을 루프입니다 - 다음은 코드의 개요입니다. 이렇게 : - How would I stop a while loop after n amount of time?

+0

pitch_energy> 임계 값이 4 초 동안 거짓 인 경우 루프에서 벗어납니다. –

+0

조건을 false로 지정하면 카운터를 사용하고 휴식을 취하는 것처럼 들립니다. –

+0

휴식 시간으로 "경과 시간"을 사용할 수있는 방법이 있습니까? –

답변

3

목록에 추가 할 때마다 시간을 절약하십시오. 그런 다음 수정하지 않은 현재 시간과 비교하십시오. 마지막 _가를 만든 이후의 시간이 어떤 임계 값보다 큰 경우, 당신은 휴식 : 이것은 가정

def pitch_detection : 

    result = [] 
    start = time.time() 
    MAX_TIME_ALLOWED = 5 # seconds 
    while True : 

     // apply pitch detection algorithm 

     if pitch_energy > threshold : 
      result.append(pitch) 
      start = time.time() # reset the time when we append. 
     else: 
      if (time.time() - start) > MAX_TIME_ALLOWED: 
       break 

    return result 

당신이 실제로 중단시기를 결정하는 경과 시간을 사용하고 싶습니다. 반복 횟수를 사용하려면 0에서 시작하는 카운터를 사용하고 time.time() 대신 else 블록에서 카운터를 증가 시키면됩니다.

def pitch_detection : 

    result = [] 
    no_append = 0 
    MAX_TIME_ALLOWED = 5 # seconds 
    while True : 

     // apply pitch detection algorithm 

     if pitch_energy > threshold : 
      result.append(pitch) 
      no_append = 0 
     else: 
      no_append += 1 
      if no_append > MAX_TIMES_ALLOWED: 
       break 

    return result 
+0

간단하고 간결합니다. 고마워요! 나에게 두통의 시간을 절약했다. –

1

alarm을 사용하면 4 초 후에 시간을 제한 할 수 있습니다. 사용할 수있는 함수와 예외 클래스가 필요하기 때문에 일부 설정이 필요합니다.

import signal 

# Define a couple things. 
class TimeoutException(Exception): 
    pass 

def timeout_handler(signum, frame): 
    raise TimeoutException() 

# Set the alarm handler. 
signal.signal(signal.SIGALRM,timeout_handler) 

alarmOn = False 
try: 
    while True: 

    # Pitch detection algorithm 

    if pitch_energy <= threshold: 
     # False condition - start your alarm. 
     if not alarmOn: 
     signal.alarm(4) 
     alarmOn = True 
    else: 
     # True condition - turn off the alarm. 
     alarmOn = False 
     signal.alarm(0) 
     result.append(pitch) 

except TimeoutException: # This happens if four seconds pass without signal.alarm(0) being called. 
    print "We're done." 
    signal.alarm(0) # Turn the alarm off 

signal.alarm() 기능을 사용하면 초를주는 어떤 값으로 타이머를 시작합니다. 알람이 리셋되지 않고 몇 초가 지나면 SIGALRM 신호가 전송됩니다. 위의 코드가 작동하는 방식은 SIGALRM 신호를 잡아 당기고 사용자 정의 TimeoutException을 던집니다. 이것은 우리가 그 예외를 잡았으므로 while 루프에서 벗어날 수있게 해줍니다.

EDIT : dano의 대답을 보면이 것이 지나치게 복잡 할 가능성이 있습니다. 우리의 가장 큰 차이점은이 솔루션을 사용하면 4 초가 지나면 즉시 수행중인 작업이 중단되어 중간에 피치 감지 알고리즘이 중지 될 수 있다는 것입니다. dano의 솔루션은 코드의 특정 지점에서 시간을 확인할 때까지 항상 대기합니다.

+1

나는 편집에 넣은 것을 정확히 언급하는 주석을 추가하려고했다. 그것은 OP를 위해 바람직하지 않을 수도 있습니다. 바람직하지 않거나 신경 쓰지 않는다면, 이것은 조금 지나치게 조작 된 것입니다. – dano

관련 문제