python - 为什么我的正弦波频率扫描不正确?

标签 python python-3.x math wav waveform

我正在尝试创建一个简单的 WAV 文件来发出变化的音调。但是,写入文件的波形与 get_sample 返回的数据并不对应。

我希望音调以对数方式变化,从 A10 (28,160 Hz) 开始,到 A0 (27.5 Hz) 结束。每过一秒,音高就会平稳地下降一个 Octave 。

实际发生的事情很难解释。语气发生了变化,但以意想不到的方式。让我的问题变得更加特殊的是,降低采样率会使问题变得更糟。在 this output在每秒 48,000 个样本的情况下,音调快速下降,然后再次上升,然后再次缓慢下降。在 this output在每秒 3,000 个样本时,也会发生类似的效果,但更加极端和困惑。我做错了什么?

from math import pi, sin
from sys import byteorder
import wave

def get_sample(time):
    frequency = a10 / 2.0 ** time
    # print('{:.15f} {:.15f} {:.15f}'.format(time, frequency, sin(pi2 * frequency * time)))
    return sin(pi2 * frequency * time)

pi2 = 2 * pi
a10 = 28160.0

NUMBER_OF_CHANNELS = 1
SAMPLE_RATE = 48000  # samples per second
SAMPLE_WIDTH = 3  # bytes
DURATION = 10  # seconds

MAX_SAMPLE_VALUE = 2 ** (SAMPLE_WIDTH * 8 - 1)

samples = bytearray()

for i in range(SAMPLE_RATE * DURATION):
    time = i / SAMPLE_RATE
    sample = round(get_sample(time) * MAX_SAMPLE_VALUE)

    if sample == MAX_SAMPLE_VALUE:
        sample -= 1

    samples.extend(sample.to_bytes(SAMPLE_WIDTH, byteorder, signed=True))

with wave.open('output.wav', 'wb') as output:
    output.setnchannels(NUMBER_OF_CHANNELS)
    output.setsampwidth(SAMPLE_WIDTH)
    output.setframerate(SAMPLE_RATE)
    output.setnframes(NUMBER_OF_CHANNELS * SAMPLE_RATE * DURATION)
    output.setcomptype('NONE', 'not compressed')

    output.writeframes(samples)

最佳答案

28,160Hz 的频率对于 48000 的采样率来说太高了。

采样率为3,000Hz,最大频率将小于1.5KHz

这与奈奎斯特采样率有关。简而言之,在给定采样率下可以采样的最大频率是采样率的 1/2。实际上,它小于采样率的 1/2。

请参阅:

https://en.wikipedia.org/wiki/Nyquist_frequency

0 https://dsp.stackexchange.com/

给定 48000Hz 采样率,您可以采样的最大频率为 24,000Hz。这个最大频率是理想的,会低很多。

要捕获 28,160Hz 频率,您需要超过 56,320Hz 的采样率。比如说 64,000Hz,或者更好 96000Hz 采样率。

编辑:顺便说一句 为什么频率函数会提升到 TIME 的幂? **

<罢工>

这会导致一些奇怪的锯齿效果

我认为应该是应该是:

frequency = a10 * time

<罢工> 我明白了...您正在进行频率扫描。从而调整每个采样时间的频率。

关于python - 为什么我的正弦波频率扫描不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44895120/

相关文章:

python - 如何在 Heroku 中运行 webapp2(appengine)?

python - 在Python中,如何将数据从Excel复制到网站?

python - 解码 python 中的错误转义字符

java - 从方程声明自动求解/写入函数(java?)

通过试验划分进行素数条件测试

python - 从 pandas 字符串列中提取最多 N 个数字,前面或后面没有任何其他数字

Python Click CLI 库 - 在验证错误时重试输入提示

python - 在 for 循环中使用变量在 pyplot 中分配图例值

python-3.x - 从 pandastable 获取索引号

math - float 学运算是否被破坏?