有人可以解释这个类(产生可改变的正弦波频率)如何工作吗?

时间:2019-02-28 19:54:52

标签: c# audio

这是我在某处在线找到的代码;它工作得很好,但是我不完全理解它是如何将一堆数学转换成音频波的:

    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();
                }
            }
        }
    }

2 个答案:

答案 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。