使用 Python 和 SciPy 将 440 Hz 正弦波写入 .wav 文件

信息处理 声音的 Python 频率 scipy
2022-02-11 03:13:27

这是我在 DSP.SE 上的第一篇文章!我是计算机科学专业的学生,​​刚刚开始接触信号和系统,因此接触离散信号并对其进行分析。

我想进一步探索这个世界,所以我的第一个目标是创建一个频率为 440 Hz 的正弦波并将其写入 .wav 文件。当然,我脑子里有所有的微积分,但我自己似乎无法弄清楚问题所在!

到目前为止,我有这个:

#!/usr/bin/env python3

import numpy as np
from scipy.io import wavfile

sampleRate = 44100

t = np.linspace(0, 20, sampleRate * 5)  #  Produces a 5 second Audio-File
y = np.sin(440 * t)  #  Should have frequency of 440Hz

wavfile.write('Sine.wav', sampleRate, y)

我理解为什么这段代码总是创建一个文件,即 5 秒长,但我不知道如何获得正确的频率!

我什至把其余的代码都弄对了吗,Dsp-Guy-wise?

1个回答

经过一些实验,我想出了以下内容:

#!/usr/bin/env python3

import numpy as np
from scipy.io import wavfile

sampleRate = 44100
frequency = 440
length = 5

t = np.linspace(0, length, sampleRate * length)  #  Produces a 5 second Audio-File
y = np.sin(frequency * 2 * np.pi * t)  #  Has frequency of 440Hz

wavfile.write('Sine.wav', sampleRate, y)

我拿出我的一本数学书,想出了如何编写正弦函数:

由于 sin(x) 的周期为 2*pi,因此 sin(2*pi*x) 的周期为 1/频率为 1Hz。因此,sin(440*2*pi*x) 的频率为 440Hz。

我不清楚的最后一件事是如何正确设置数组长度和元素计数!

选择在 44.1 kHz 采样率下采样率为 5 秒的文件,我需要 5 * 44.1k 个样本,所以已经可以了。但是由于 sin(440*2*pi*x) 执行 440 个周期直到 t == 1,所以数组的持续时间必须为 5(在我的情况下准确地说是 5 秒)。扩大阵列边界会将阵列值挤压在一起,从而产生更高音调的声音。

对不起任何已经挠头的人,我可能应该考虑更长一点!