как узнать, сколько элементов в массиве list / numpy и тоне plot_dtmf genrator_sum из графиков sin - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь построить список "кадров".Но я не могу правильно построить график, не зная, сколько элементов в этом списке фреймов.или есть какой-либо другой способ построить сумму графиков греха.Тип кадров - это список.Но когда я печатаю, это показывает, как массив NumPy.Я использую значения numpy sin внутри этого списка.когда я посчитал len из списка кадров, он показывается как 1. Но мне нужно найти, сколько значений в этом массиве.Также, пожалуйста, предложите мне какой-нибудь более простой и хороший способ для построения результатов. Целью кода является генерация тонов dtmf 0-9 и построение суммы графиков греха.генерируются тоны, но я застрял в части прорисовки.

FORMAT = pyaudio.paFloat32
CHANNELS = 1
RATE = 44100
CHUNK = 1024
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "dtmf.wav"
p = pyaudio.PyAudio()

def sine_wave(frequency, length, rate):
    length = int(length * rate)
    factor = float(frequency) * (math.pi * 2) / rate
    return np.sin(np.arange(length) * factor)


def sine_sine_wave(f1, f2, length, rate):
    s1=sine_wave(f1,length,rate)
    s2=sine_wave(f2,length,rate)
    ss=s1+s2
    sa=np.divide(ss, 2.0)
    return sa

def play_tone(stream, frequency=440, length=0.10, rate=44100):
    frames = []
    frames.append(sine_wave(frequency, length, rate))
    chunk = np.concatenate(frames) * 0.25
    stream.write(chunk.astype(numpy.float32).tostring())

def play_dtmf_tone(stream, digits, length=0.2, rate=44100):
    dtmf_freqs = {'1': (1209,697), '2': (1336, 697), '3': (1477, 697),
                  '4': (1209,770), '5': (1336, 770), '6': (1477, 770),
                  '7': (1209,852), '8': (1336, 852), '9': (1477, 852),
                  '*': (1209,941), '0': (1336, 941), '#': (1477, 941)}
    dtmf_digits = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '0', '#']
    if type(digits) is not type(''):
        digits=str(digits)[0]
    digits = ''.join ([dd for dd in digits if dd in dtmf_digits])
    joined_chunks = []
    print(digits)
    for digit in digits:
        digit=digit.upper()
        frames = []
        frames.append(sine_sine_wave(dtmf_freqs[digit][0], dtmf_freqs[digit][1], length, rate))
        chunk = np.concatenate(frames) * 0.25
        joined_chunks.append(chunk)

        # fader section
        fade = 200 # 200ms
        fade_in = np.arange(0., 1., 1/fade)
        fade_out = np.arange(1., 0., -1/fade)

        chunk[:fade] = np.multiply(chunk[:fade], fade_in) # fade sample wave in
        chunk[-fade:] = np.multiply(chunk[-fade:], fade_out) # fade sample wave out
        time.sleep(0.1)

    X = np.array(joined_chunks, dtype='float32') # creates an one long array of tone samples to record
    stream.write(X.astype(np.float32).tostring()) # to hear tones

    list_test = frames 
    N = 100
    time_max = 1
    d_time = time_max/N
    times = np.linspace(0, time_max,N)
    print(("frames :{}").format(frames))
    print(type(frames))
    print(len(frames))
    plt.plot(times, frames)


    # record tone sequence float 32 array as a wave file section 
    for i in range(0, int(RECORD_SECONDS)):
        waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
        waveFile.setnchannels(CHANNELS)
        waveFile.setsampwidth(p.get_sample_size(FORMAT))
        waveFile.setframerate(RATE)
        waveFile.writeframes(X.astype(np.float32).tostring())
        waveFile.close()


if __name__ == '__main__':
    stream = p.open(format=pyaudio.paFloat32,
                    channels=1, rate=44100, output=1,frames_per_buffer=CHUNK)

# Dial a telephone number.
    if len(sys.argv) != 2:
        user_input = input()
        sp_user_input = user_input.split()
        digits = str(np.array([sp_user_input])) # set random length of numbers to pluck from list a
        # below preps random list of numbers for inclusion into csv file
        digits=digits.replace("[",'') # replace characters with null
        digits=digits.replace("]",'')
        digits=digits.replace("'",'')
        digits=digits.replace("\n",'')
        digits=digits.replace(" ",'') # replace space with null
        print(digits)


    else:
        digits = sys.argv[2]
    play_dtmf_tone(stream, digits)

    stream.close()
    p.terminate()



1 Ответ

0 голосов
/ 11 июня 2019

Вы инициализируете свой список frames внутри своего цикла, поэтому он всегда имеет длину 1 элемент в конце.

Вместо этого вы должны сделать:

(...)
frames = []
for digit in digits:
        (...)
        frames.append(...)
print(len(frames))
...