如何在Python中的wave生成中使用队列实现多线程
我有一个代码可以生成 1 Hz 到 7 Hz 的正弦波,采样率为 1000 Hz。要求是生成一个多线程程序,其中使用 10 次迭代的 for 循环来获取正弦波的值。每次循环得到 100 点,因此执行 for 循环 10 次将产生 100 x10 = 1000 点。这千个点必须存储在队列中,从而将队列值传输到下一个线程。
这是我生成正弦波点的代码
import numpy as np
import pandas as pd
def get_values_for_frequency(freq):
# sampling information
omega = 2*np.pi*freq # angular frequency for sine waves with amplitude 1
t_vec = np.linspace(0,1,num=1000,endpoint=True) # time
y = np.sin(omega*t_vec) #sine wave generation
return y
#columns are created for sine wave frequencies
df = pd.DataFrame(columns =['1Hz','2Hz', '3Hz', '4Hz', '5Hz', '6Hz', '7Hz'])
df['1Hz']=pd.Series(get_values_for_frequency(1))
df['2Hz']=pd.Series(get_values_for_frequency(2))
df['3Hz']=pd.Series(get_values_for_frequency(3))
df['4Hz']=pd.Series(get_values_for_frequency(4))
df['5Hz']=pd.Series(get_values_for_frequency(5))
df['6Hz']=pd.Series(get_values_for_frequency(6))
df['7Hz']=pd.Series(get_values_for_frequency(7))
df = df.round(decimals = 6) #Round a table values in DataFrame to3 decimal places
df['1Hz']=(2**15) *df['1Hz'] #values are converted into int16 equivalent
df['2Hz']=(2**15) *df['2Hz']
df['3Hz']=(2**15) *df['3Hz']
df['4Hz']=(2**15) *df['4Hz']
df['5Hz']=(2**15) *df['5Hz']
df['6Hz']=(2**15) *df['6Hz']
df['7Hz']=(2**15) *df['7Hz']
df = df.astype(np.int16) #converting float datatype to int16
arr=df.to_numpy(dtype='int16')
The arr numpy array has the values for sine waves 1000X7 rows and columns.
要求是将其实现为多线程程序,其中以下部分必须执行 10 次,每次必须收集 100 个值,在 10 次循环后,必须聚合所有值并将其发送到通过队列进行下一步处理。
def get_values_for_frequency(freq):
omega = 2*np.pi*freq # angular frequency for sine waves with amplitude 1
t_vec = np.linspace(0,1,num=1000,endpoint=True) # time
y = np.sin(omega*t_vec) #sine wave generation
return y
#columns are created for sine wave frequencies
df = pd.DataFrame(columns =['1Hz','2Hz', '3Hz', '4Hz', '5Hz', '6Hz', '7Hz'])
df['1Hz']=pd.Series(get_values_for_frequency(1))
df['2Hz']=pd.Series(get_values_for_frequency(2))
df['3Hz']=pd.Series(get_values_for_frequency(3))
df['4Hz']=pd.Series(get_values_for_frequency(4))
df['5Hz']=pd.Series(get_values_for_frequency(5))
df['6Hz']=pd.Series(get_values_for_frequency(6))
df['7Hz']=pd.Series(get_values_for_frequency(7))
当我尝试实现时,我只得到 100x 7 ielast 迭代值。谁能指导我解决这个问题,
这是我尝试过的代码。
import threading
import numpy as np
from queue import Queue
import pandas as pd
def get_values_for_frequency(freq):
omega = 2*np.pi*freq
t_vec = np.linspace(origin,end,num=100,endpoint=True)
y = np.sin(omega*t_vec)
return y
def thread_task(in_q):
global df, df1,end,origin
df= pd.DataFrame(columns =['1Hz','2Hz', '3Hz', '4Hz', '5Hz', '6Hz', '7Hz'])
end=1/10
origin=0
for _ in range(10):
df['1Hz']=pd.Series(get_values_for_frequency(1))
df['2Hz']=pd.Series(get_values_for_frequency(2))
df['3Hz']=pd.Series(get_values_for_frequency(3))
df['4Hz']=pd.Series(get_values_for_frequency(4))
df['5Hz']=pd.Series(get_values_for_frequency(5))
df['6Hz']=pd.Series(get_values_for_frequency(6))
df['7Hz']=pd.Series(get_values_for_frequency(7))
origin=end
end+=end
df = df.round(decimals = 6)
df['1Hz']=(2**15) *df['1Hz']
df['2Hz']=(2**15) *df['2Hz']
df['3Hz']=(2**15) *df['3Hz']
df['4Hz']=(2**15) *df['4Hz']
df['5Hz']=(2**15) *df['5Hz']
df['6Hz']=(2**15) *df['6Hz']
df['7Hz']=(2**15) *df['7Hz']
df = df.astype(np.int16)
in_q.put(df)
def output(out_q):
while True:
print(out_q.get())
def main_task():
global df
global df1
global end
global origin
df= pd.DataFrame(columns =['1Hz','2Hz', '3Hz', '4Hz', '5Hz', '6Hz', '7Hz'])
df1=pd.DataFrame()
q = Queue()
lock = threading.Lock()
t1 = threading.Thread(target=thread_task, args=(q,))
t2 = threading.Thread(target=output, args=(q,))
t1.start()
t2.start()
t1.join()
t2.join()
if __name__ == "__main__":
main_task()
I have a code to generate sine wave of 1 Hz to 7 Hz with sampling rate of 1000 Hz. The requirement is that to generate a multithreading program where for loop of 10 iteration is used to get values of sine waves. Each time the loop gets 100 points thus executing the for loop 10 times will produce 100 x10 = 1000 points. The thousand points must be stored in a queue and thus transfering the queue value to the next thread.
Here is my code which generates a Sine wave points
import numpy as np
import pandas as pd
def get_values_for_frequency(freq):
# sampling information
omega = 2*np.pi*freq # angular frequency for sine waves with amplitude 1
t_vec = np.linspace(0,1,num=1000,endpoint=True) # time
y = np.sin(omega*t_vec) #sine wave generation
return y
#columns are created for sine wave frequencies
df = pd.DataFrame(columns =['1Hz','2Hz', '3Hz', '4Hz', '5Hz', '6Hz', '7Hz'])
df['1Hz']=pd.Series(get_values_for_frequency(1))
df['2Hz']=pd.Series(get_values_for_frequency(2))
df['3Hz']=pd.Series(get_values_for_frequency(3))
df['4Hz']=pd.Series(get_values_for_frequency(4))
df['5Hz']=pd.Series(get_values_for_frequency(5))
df['6Hz']=pd.Series(get_values_for_frequency(6))
df['7Hz']=pd.Series(get_values_for_frequency(7))
df = df.round(decimals = 6) #Round a table values in DataFrame to3 decimal places
df['1Hz']=(2**15) *df['1Hz'] #values are converted into int16 equivalent
df['2Hz']=(2**15) *df['2Hz']
df['3Hz']=(2**15) *df['3Hz']
df['4Hz']=(2**15) *df['4Hz']
df['5Hz']=(2**15) *df['5Hz']
df['6Hz']=(2**15) *df['6Hz']
df['7Hz']=(2**15) *df['7Hz']
df = df.astype(np.int16) #converting float datatype to int16
arr=df.to_numpy(dtype='int16')
The arr numpy array has the values for sine waves 1000X7 rows and columns.
The requirement is to implement it as multithreaded program where the below part must be executed 10 times and each times 100 values must be collected and after 10 loops ,all the values must be aggregated and send to through queue for next processing.
def get_values_for_frequency(freq):
omega = 2*np.pi*freq # angular frequency for sine waves with amplitude 1
t_vec = np.linspace(0,1,num=1000,endpoint=True) # time
y = np.sin(omega*t_vec) #sine wave generation
return y
#columns are created for sine wave frequencies
df = pd.DataFrame(columns =['1Hz','2Hz', '3Hz', '4Hz', '5Hz', '6Hz', '7Hz'])
df['1Hz']=pd.Series(get_values_for_frequency(1))
df['2Hz']=pd.Series(get_values_for_frequency(2))
df['3Hz']=pd.Series(get_values_for_frequency(3))
df['4Hz']=pd.Series(get_values_for_frequency(4))
df['5Hz']=pd.Series(get_values_for_frequency(5))
df['6Hz']=pd.Series(get_values_for_frequency(6))
df['7Hz']=pd.Series(get_values_for_frequency(7))
when I try to implement , I got only 100x 7 i.e.last iteration value. Could anyone guide me to solve this
here is my code which I tried.
import threading
import numpy as np
from queue import Queue
import pandas as pd
def get_values_for_frequency(freq):
omega = 2*np.pi*freq
t_vec = np.linspace(origin,end,num=100,endpoint=True)
y = np.sin(omega*t_vec)
return y
def thread_task(in_q):
global df, df1,end,origin
df= pd.DataFrame(columns =['1Hz','2Hz', '3Hz', '4Hz', '5Hz', '6Hz', '7Hz'])
end=1/10
origin=0
for _ in range(10):
df['1Hz']=pd.Series(get_values_for_frequency(1))
df['2Hz']=pd.Series(get_values_for_frequency(2))
df['3Hz']=pd.Series(get_values_for_frequency(3))
df['4Hz']=pd.Series(get_values_for_frequency(4))
df['5Hz']=pd.Series(get_values_for_frequency(5))
df['6Hz']=pd.Series(get_values_for_frequency(6))
df['7Hz']=pd.Series(get_values_for_frequency(7))
origin=end
end+=end
df = df.round(decimals = 6)
df['1Hz']=(2**15) *df['1Hz']
df['2Hz']=(2**15) *df['2Hz']
df['3Hz']=(2**15) *df['3Hz']
df['4Hz']=(2**15) *df['4Hz']
df['5Hz']=(2**15) *df['5Hz']
df['6Hz']=(2**15) *df['6Hz']
df['7Hz']=(2**15) *df['7Hz']
df = df.astype(np.int16)
in_q.put(df)
def output(out_q):
while True:
print(out_q.get())
def main_task():
global df
global df1
global end
global origin
df= pd.DataFrame(columns =['1Hz','2Hz', '3Hz', '4Hz', '5Hz', '6Hz', '7Hz'])
df1=pd.DataFrame()
q = Queue()
lock = threading.Lock()
t1 = threading.Thread(target=thread_task, args=(q,))
t2 = threading.Thread(target=output, args=(q,))
t1.start()
t2.start()
t1.join()
t2.join()
if __name__ == "__main__":
main_task()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论