gpt4 book ai didi

python - 生成的正弦波听起来嗡嗡作响或 'square' 而不是正弦波

转载 作者:行者123 更新时间:2023-12-01 23:32:22 25 4
gpt4 key购买 nike

我之前问过一个类似的问题,但我把问题弄得比原来更复杂。我正在生成 100 赫兹的正弦波,然后使用 simpleaudio 进行播放。
注意: 我在将波形编码为 .wav 文件时遇到了这个问题。听起来与简单音频完全一样。将 channel 从 2 更改为 1 也会改变声音,但不能解决此问题。

安装简单的音频:

sudo apt-get install -y python3-dev libasound2-dev
python -m pip install simpleaudio

独立代码:

import numpy as np
import simpleaudio as sa
import matplotlib.pyplot as plt

def generate_sine_tone(numsamples, sample_time, frequency):
t = np.arange(numsamples) * sample_time # Time vector
signal = 8388605*np.sin(2*np.pi * frequency*t)
return signal

if __name__ == "__main__":
duration = 1
samprate = 44100 # Sampling rate
numsamples = samprate*duration# Sample count
st = 1.0 / samprate # Sample time
t = np.arange(numsamples) * st # Time vecto

nchannels = 2
sampwidth = 3

signal = generate_sine_tone(numsamples, st, 100)
signal2 = np.asarray([ int(x) for x in signal ])

play_obj = sa.play_buffer(signal2, nchannels, sampwidth, samprate)
print(signal2)
plt.figure(0)
plt.plot(signal2)
plt.show()

在命令行中运行它会生成 1 秒或 44100 个样本的正弦波图,这是正弦波的 100 个周期。它还会将声音播放到您的扬声器中,因此在运行之前将系统声音调低一点。

enter image description here

我关于此问题的其他帖子:Trying to generate a sine wave '.wav' file in Python. Comes out as a square wave
https://music.stackexchange.com/questions/110688/generated-sine-wave-in-python-comes-out-buzzy-or-square-ey

预期声音:https://www.youtube.com/watch?v=eDk1bOX-P3w&t=4s
收到的声音(大约):https://www.youtube.com/watch?v=F7DnVBJ9R34

这个问题让我非常烦恼,如果能提供任何帮助,我将不胜感激。

最佳答案

这里有两个问题。

较小的一个是您正在创建一个阵列并像立体声一样播放它。您需要设置 nchannels = 1(或通过创建包含两列的数组来复制所有值)。

另一个问题是尝试创建 24 位样本。很少有人拥有足够好的设备和足够好的耳朵来分辨 24 位和 16 位音频之间的区别。使用 2 的样本宽度使事情变得容易得多。您可以根据需要生成 24 位样本并将它们标准化为 16 位以进行播放:signal *= 32767/np.max(np.abs(signal))

这段代码有效

import numpy as np
import simpleaudio as sa

def generate_sine_tone(numsamples, sample_time, frequency):
t = np.arange(numsamples) * sample_time # Time vector
signal = 32767*np.sin(2*np.pi * frequency*t)
return signal

duration = 1
samprate = 44100 # Sampling rate
numsamples = samprate*duration# Sample count
st = 1.0 / samprate # Sample time

nchannels = 1
sampwidth = 2

signal = generate_sine_tone(numsamples, st, 100)
signal2 = signal.astype(np.int16)
#signal2 = np.asarray([ int(x) for x in signal ])

play_obj = sa.play_buffer(signal2, nchannels, sampwidth, samprate)
play_obj.wait_done()

关于python - 生成的正弦波听起来嗡嗡作响或 'square' 而不是正弦波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66129025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com