Python询问信号p

2022-05-21 07:08:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要用Python(Spyder)绘制以下3个信号。下面,我已经指出了我的代码需要绘制的信号的照片(我第一次成功地绘制了它。) enter image description here

此外,代码需要绘制来自数组字[1,0,1,0,0,1,0,1,0,1,1,1,0,1]的平方信号(我还没想好怎么做)

enter image description here

最后,应根据上述两个信号绘制以下信号

enter image description here

在上一篇文章(堆栈溢出)中,我得到了一些帮助来绘制正方形信号。然而,我认为这不是这样做的方式,因为我收到以下错误,当我试图绘制第三个信号

ASK_signal=pliroforia*our_signal

ValueError: operands could not be broadcast together with shapes (1440000,) (250,)

有人能帮我解决这个问题吗

以下是我目前的代码:

import fft_modules
from fft_modules import *
import numpy as np
from numpy import pi, linspace, sin, cos, array
import matplotlib.pyplot as plt
from scipy import signal
from scipy import *

A=1                                                 
f=1000
T=1/f                                          
B=f                                            
Nyquist_Fs=2*B                                 
Fs=100*Nyquist_Fs                              
Ts=T/10                                        
Tmax=25*T                                      
samples_per_period=T/Ts                        
total_samples=samples_per_period*(Tmax/T)      

print("TS="+str(Ts))
print("T="+str(T))

t = linspace(0, Tmax, total_samples, endpoint=True)

#our_signal = signal.square(A*cos(2*pi*f*t))
our_signal = A*sin(2*pi*f*t)


plt.figure(1)
plt.plot(t,our_signal)
plt.xlabel('Χρόνος (sec) ->')
plt.ylabel ('Πλάτος (V)')



word = array([1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1])
Samples_per_bit=int(12/Ts)
pliroforia=[]
for i in range(0,len(word)):
    table=np.ones(Samples_per_bit)
    x=table*word[i]
    pliroforia=np.concatenate((pliroforia,x))

t = linspace(0, Tmax, pliroforia.shape[0], endpoint=True)

plt.figure(2)
plt.plot(t,pliroforia)
plt.xlabel('Χρόνος (sec) ->')
plt.ylabel ('Πλάτος (V)')


ASK_signal=pliroforia*our_signal
plt.figure(3)
plt.plot(t,ASK_signal)

Tags: 代码fromimportsignal信号np绘制ourpltasksamplestspertmaxpliroforia
1条回答
网友
1楼 ·

您的错误来自数组之间不兼容的形状。 在计算其乘积之前,必须确保pliroforiaour_signal具有相同数量的元素

我认为这就是您试图通过for循环实现的目标。 但它不应该像你期望的那样工作

这里的问题是“重采样”(我不确定它是否正确,但它在搜索引擎中有帮助)。 有两个系列,从时间0到时间Tmax(这里是0.25),一个有total_samples(250)个样本,另一个只有12个样本。 你想重新采样你的第二个系列多达250个样品,以有兼容的形状

这是一个常见的问题,大多数好的库都有“重采样”操作。 在scipy中,它被称为^{}。 你用你的“短”序列的x和y值来调用它,它给了你一个函数,你可以用一个新的x值数组来调用这个函数,在这个数组中你想对你的初始序列进行采样(这不是很清楚,看看代码,一个值几千字的例子)

下面是结果代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d

def main():
    frequency=1000
    period=1/frequency
    duration=25*period
    samples_per_period=10
    total_samples=int(samples_per_period*(duration/period))

    t = np.linspace(0, duration, total_samples, endpoint=True)
    waving_signal = np.sin(2*np.pi * frequency * t)

    word = np.array([1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1])  # -> array of size 12
    word_x_values = np.linspace(0, duration, word.shape[0])  # These 12 samples cover the same duration as the waving signal -> array of shape 12
    word_interpolator = interp1d(word_x_values, word, kind="previous")  # Get an interpolator for this serie
    resampled_word = word_interpolator(t)  # Get a new serie with same sampling as the waving signal -> array of size 250

    # Now you can mix the signals as the series have compatible shapes
    mixed_signal = resampled_word * waving_signal

    fig, axes = plt.subplots(3, 1, sharex="col")
    axes[0].plot(t, waving_signal)
    axes[1].plot(t, resampled_word)
    axes[2].plot(t, mixed_signal)

    plt.show()


if __name__ == '__main__':
    main()

以及由此产生的情节

enter image description here


编辑

我只是注意到我的文字信号和你期望的不符。 这是由“坏”x值生成引起的。 word的12个样本不覆盖整个duration

要解决这个问题,您可以使用更多参数(我认为这在语义上更正确):

word = np.array([1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1])
# Use the endpoint argument as these samples do not cover up to the whole duration
word_x_values = np.linspace(0, duration, word.shape[0], endpoint=False)
# Initial x values do not cover the whole duration range
# You have to handle this with bounds_error and fill_value
word_interpolator = interp1d(
    word_x_values, word, kind="previous",
    bounds_error=False, fill_value=(word[0], word[-1])
)
resampled_word = word_interpolator(t)

另一个可能更简单但意义不大的解决方案是向word添加一个样本,使其覆盖整个持续时间:

word = [1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1]
word.append(word[-1])
word = np.array(word)  # Duplicate the last sample
# No more change
word_x_values = np.linspace(0, duration, word.shape[0])  # -> array of shape 13
word_interpolator = interp1d(word_x_values, word, kind="previous")
resampled_word = word_interpolator(t)

现在,signal这个词更像您所期望的(以一个完整的1位开始和结束):

enter image description here