首页 > 解决方案 > 如何查找列表/numpy数组中的元素数量和正弦图的plot_dtmf色调genrator_sum

问题描述

我正在尝试绘制“框架”列表。但是如果不知道这个框架列表中有多少元素,我就无法正确绘制。或者有没有其他方法可以绘制罪恶图的总和。帧的类型是列表。但是当我打印它时,它显示为一个 numpy 数组。我在这个列表中使用 numpy sin 值。当我计算帧列表的 len 时,它显示为 1。但我需要找到这个 numpy 数组中有多少个值。还请建议我任何更简单和更好的方法来绘制结果。代码的目的是生成 dtmf 音调 0-9 并绘制 sin 图的总和。音调正在生成,但我被困在绘图部分。

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()



标签: pythonnumpydtmf

解决方案


您正在循环内初始化您的frames列表,因此它最后总是 1 个元素。

你应该这样做:

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

推荐阅读