python - 如何查找列表/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()
解决方案
您正在循环内初始化您的frames
列表,因此它最后总是 1 个元素。
你应该这样做:
(...)
frames = []
for digit in digits:
(...)
frames.append(...)
print(len(frames))
推荐阅读
- ios - 如何从 WKWebView 获取服务器的响应
- sql - 如何编写 SQL 查询来选择得分高于上一年的击球手
- cassandra - 带有更新的 Cassandra 集群订单 [性能]
- java - 序列化 CachedRowSet
- javascript - 带有标题和下拉的数据表
- sql - 当函数在多个插入之一上失败但执行了触发器时,Postgresql 捕获回滚
- python - 未收到数据
- ios - 带有 kCLLocationAccuracyBestForNavigation 的 CLLocationManager 不是很准确
- angular - 如何在 SeleniumWebdriver 脚本中处理 shadowdom
- shell - 使用 sed 将时间戳替换为日期