如何在Python中的wave生成中使用队列实现多线程

发布于 2025-01-12 16:13:33 字数 4181 浏览 5 评论 0原文

我有一个代码可以生成 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文