Python处理大量的正弦信号

Python处理大量的正弦信号

学习目标:
完成此 Jupyter Notenook 后,您应该
能够在 Python 中编写和调用函数生成音乐会音高信号
从给定的向量中切出所需的部分并连接向量理解信号叠加的概念
Matplotlib 用于图形输出(如 specgram() 等)
Numpy 命令 concatenate()、exp() 等
librosa 命令 resample() 等

任务 1:创建正弦波的函数 + 任务 2:可视化正弦波
我们已经熟悉从上一个实验表生成正弦信号。 因为这次我们需要大量的正弦信号,所以创建一个计算正弦的函数是有意义的。
请编写一个函数 get_sine_wave(frequency_hz, length_s, sample_rate_hz) 以所需的采样率 fs 返回具有给定频率 f 和持续时间(以秒为单位)的正弦波。

# Let's do the ususal necessary and nice-to-have imports
%matplotlib inline
import matplotlib.pyplot as plt  # plotting
import seaborn as sns; sns.set() # styling 
import numpy as np               # math

def get_sine_wave(frequency_Hz, length_s=1, fs_Hz=8000):
    """
    frequency_Hz : float
        frequency $f$ of the sine to be generated 
    length_s : float, optional
        length of the sine signal to be generated,default: 1 sec.
    fs_Hz : float, optional
        sampling frequency $f_s$, default: 8000 Hz
    """
    # create time vector $t$
    time_vector = np.linspace(0, length_s,
                              int(length_s * fs_Hz),
                              endpoint=False)
    # return sine of frequency $f$, i.e. variable frequency_Hz
    return np.sin(2 * np.pi * frequency_Hz * time_vector)

# crate a sine of f=440 Hz at a sampling frequency f_s = 8 kHz of 2 seconds length
concert_pitch = get_sine_wave(440, 2, 8000)
# Look at the first 30 ms (240 / 8000 = 0.03 s) of the generated wave
plt.plot(concert_pitch[:240])
#First 240 examples
plt.xlabel('sample $k$')
plt.ylabel('sine of 440 Hz')
plt.title('First 240 samples of sine of 440 Hz')
None # This command does nothing but prevents printing the result of previous function call

np.linspace通过定义均匀间隔创建数值序列。其实,需要指定间隔起始点、终止端,以及指定分隔值总数(包括起始点和终止点);最终函数返回间隔类均匀分布的数值序列。请看示例:
np.linspace(start = 0, stop = 100, num = 5)
result:0,25,50,75,100

任务 3:连接不同频率的正弦波
我们可以连接信号以形成更长的信号。 例如,我们想要创建一个具有一半音乐会音高频率的新信号,然后与音乐会音高交替播放 2 次。

half_concert_pitch = get_sine_wave(220, 2, 8000)
# Look at the first 0.02 s of the signals

plt.plot(half_concert_pitch[:160], "red",label="sine with $f=200$ Hz")
plt.plot(concert_pitch[:160], "green",label="sine with $f=400$ Hz")
plt.xlabel('samples $k$')
plt.legend(loc='upper right') # create a legend showing the line labels 

alternation = np.concatenate((half_concert_pitch, concert_pitch,
                              half_concert_pitch, concert_pitch))

####################################################
plt.figure(figsize=(8,5)) # create figure of size 8 x 5 inches
plt.plot(half_concert_pitch[:160], "red", alpha=0.3, label='1/2 concert pitch ($f=220$ Hz)')
plt.plot(concert_pitch[:160], "green", alpha=0.3, label='concert pitch ($f=440$ Hz)')
plt.plot(half_concert_pitch[:160] + concert_pitch[:160], label='superposition')
plt.legend(loc='upper right')
ipd.Audio(half_concert_pitch + concert_pitch, rate=8000)

我们可以观察到绿色 Concert_pitch 的频率恰好是红色信号 half_concert_pitch 的两倍,即当两个绿色曲线周期适合一个红色曲线周期时(参见例如样本 k=0 和 k≈34 之间)。

将两个信号加在一起给出了一个信号,其中两个频率都可以听到。 生成的信号不再像正弦波,但我们仍然可以清楚地看到它的周期性。 在本模块的后面(以及后面的实验工作表中),我们将分析频域中的频率内容,并将了解在频域中可以更好地区分此类信号。

周期性是如此突出,因为一个频率是另一个频率的倍数。 如果不是这种情况,信号重复其模式可能需要更长的时间。

两个频率相近的正弦信号看起来和听起来像这样:

signal_1 = get_sine_wave(440, 2, 8000)
signal_2 = get_sine_wave(400, 2, 8000)
samples = 600                           # samples used for plotting

plt.figure(figsize=(8,5)) # create figure of size 8 x 5 inches
plt.plot(signal_1[:samples], "red", alpha=0.3, label='sine with $f=440$ Hz')
plt.plot(signal_2[:samples], "green", alpha=0.3, label='sine with $f=400$ Hz')
plt.plot(signal_1[:samples] + signal_2[:samples], label='superposition')
plt.legend()

ipd.Audio(signal_1 + signal_2, rate=8000)  # play sum of two (sine) signals

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值