这是我在某处在线找到的代码;它工作得很好,但是我不完全理解它是如何将一堆数学转换成音频波的:
public static void Beeps(int Amplitude, int Frequency, int Duration)
{
double A = ((Amplitude * (System.Math.Pow(2, 15))) / 1000) - 1;
double DeltaFT = 2 * Math.PI * Frequency / 44100.0;
int Samples = 441 * Duration / 10;
int Bytes = Samples * 4;
int[] Hdr =
{ 0X46464952, 36 + Bytes, 0X45564157,
0X20746D66, 16, 0X20001, 44100, 176400, 0X100004,
0X61746164, Bytes };
using (MemoryStream MS = new MemoryStream(44 + Bytes))
{
using (BinaryWriter BW = new BinaryWriter(MS))
{
for (int I = 0; I < Hdr.Length; I++)
{
BW.Write(Hdr[I]);
}
for (int T = 0; T < Samples; T++)
{
short Sample = System.Convert.ToInt16(A * Math.Sin(DeltaFT * T));
BW.Write(Sample);
BW.Write(Sample);
}
BW.Flush();
MS.Seek(0, SeekOrigin.Begin);
using (SoundPlayer SP = new SoundPlayer(MS))
{
SP.PlaySync();
}
}
}
}
答案 0 :(得分:0)
看起来它所做的只是在一定的音调下发出蜂鸣声。数学转换为声音的原因是,当数据馈送到扬声器时,实际上是字节,告诉它在该瞬间如何振动。
如果您询问声音的工作原理,则取决于振动如何在空中传播。振动以波浪的形式存在。从字面上看,它们正在以某种方式摇动空气,您的大脑将这种方式解释为通过耳朵的噪音。如果声音的音高较高,则声波会彼此靠近;如果声音的音高较低,则声波将相距较远。这就是为什么计算机可以“将一堆数学运算转换成音频波形”的原因,因为这实际上就是:不断操纵的波形。该方法采用一个波长(from matplotlib import pyplot as plt
import numpy as np
iou=[0.2, 0.4, 0.6, 0.8]
precision = np.random.randint(0, 10, size=(4, 10))
fig, ax = plt.subplots(1, 1)
for i in range(0,4):
ax.plot(np.r_[:10], iou[i] * precision[i], marker='+', label=iou[i])
fig.legend()
ax.set_title("PR curves")
ax.set_xlabel("Recall")
ax.set_ylabel("Precision")
),并基于该波长创建一个正弦波,将其转换为字节,并以一定的音量(Frequency
)并在一定的持续时间内馈入扬声器。好东西吧?
此外,您正在查看的是“方法”,而不是课程。 :)
如果您有兴趣,可以在这里进一步了解声音:https://en.wikipedia.org/wiki/Sound#Sound_wave_properties_and_characteristics
答案 1 :(得分:0)
This answer很好地概述了wav文件的工作方式:
只需以固定间隔对波形进行采样,然后将每个间隔的幅度写入文件即可。
这就是BW.Write
调用所做的。 T
代表时间。
为了播放声音,该数据应放在Hdr
部分之后,该部分只是标准.wav
文件的正确标题。 0X46464952
是“ RIFF”的ascii,而0X45564157
是“ WAVE”。玩家需要知道以什么速率采样波。在这种情况下,这是通用标准44100。