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 - QtWidgets.QProgressBar.setTextVisible(False) 导致滞后

python-3.x - 在文本列上使用 Pandas 滚动功能

math - 您将如何不断改进曼德布罗分形?

Python - 将一个参数的多个值发送给函数

python - 通过nodejs执行python脚本

python - 当我使用 concurrent.futures 时,无法弄清楚如何将结果写回同一个工作表

python - 在 lambda 中调用属性 setter

algorithm - 编码/纠错挑战

Javascript IRR(内部 yield )公式准确性

python - 根据条件创建新的 numpy 数组