【问题标题】:Can someone explain how this class (which generates a sine wave frequency that can be changed) works?有人可以解释这个类(它产生一个可以改变的正弦波频率)是如何工作的吗?
【发布时间】:2019-03-01 05:10:58
【问题描述】:

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

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

【问题讨论】:

  • 您应该添加此代码的原始来源的归属。

标签: c# audio


【解决方案1】:

看起来它所做的只是在某些音高处发出哔哔声。数学转换成声音的原因是因为当数据被输入到你的扬声器时,它实际上是字节告诉它在那一瞬间如何振动。

如果您要询问声音的工作原理,它是基于振动在空气中的传播方式。振动以波的形式存在;它们实际上是在以某些模式摇动空气,你的大脑将这些模式解释为通过你的耳朵发出的噪音。如果声音的音高较高,则声波彼此更近,如果音高较低,则声波距离较远。这就是为什么计算机可以“将一堆数学转换为音频波”的原因,因为这就是真正的声音:不断操纵的波。该方法采用波长 (Frequency) 并基于它创建一个正弦波,将其转换为字节,然后以一定的音量 (Amplitude) 将其馈送到您的扬声器并持续一定的时间。很酷的东西吧?

另外,您正在查看的是“方法”,而不是类。 :)

如果您有兴趣,这里有更多关于声音的信息:https://en.wikipedia.org/wiki/Sound#Sound_wave_properties_and_characteristics

【讨论】:

  • 我对声音的科学以及扬声器的实际发声方式了解很多,但我的意思是计算机如何将数学转换为正弦波,然后将其转换为字节(相当详细,虽然这就像教数学,与编码无关)。显然在代码的末尾,它只是说 PlaySync() 我猜这使得输出音频更容易
  • 嗯,正弦波在技术上已经是数学,所以我不确定你的意思。老实说,我不知道数学本身是如何工作的,因为我没有真正研究过任何关于声音的东西,我只是认识到它正在产生一个正弦波,它会插入到内存流中。所以我想我无法回答你的问题,抱歉:/ SP.PlaySync() 只是 SoundPlayer 类启动音频波形的方法,如 SQL 的 SqlConnection.Open()。
  • 我猜想将正弦波“插入”到内存流中,然后将该内存流插入到声音播放器中会产生一些逻辑,我有点明白。但是在代码中制作正弦波...... wut??? tbh 就像我说的那样,它很可能需要一些复杂的数学理解
  • 是的,很可能。我理解这个想法,但数学在我个人之上。也许从方法的创建者那里寻找一些文档。
【解决方案2】:

This answer 很好地概述了 wav 文件的工作原理:
只需按固定间隔对波形进行采样,然后将每个间隔的幅度写入您的文件。
这就是BW.Write 电话正在做的事情。 T 代表时间。

为了播放声音,该数据位于Hdr 部分之后,这只是标准.wav 文件的正确标题。 0X46464952 是“RIFF”的 ascii,0X45564157 是“WAVE”。玩家需要知道波的采样率。在这种情况下,它是 44100,这是一个通用标准。

【讨论】:

    猜你喜欢
    • 2019-12-12
    • 2011-09-12
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多