gpt4 book ai didi

c++ - 从音频中绘制波形的算法

转载 作者:可可西里 更新时间:2023-11-01 17:07:39 27 4
gpt4 key购买 nike

我正在尝试从原始音频文件中绘制波形。我使用 FFmpeg 解复用/解码了一个音频文件,我有这些信息:样本缓冲区、样本缓冲区的大小、音频文件的持续时间(以秒为单位)、采样率(44100、48000 等)、样本大小、样本格式(uint8、int16、int32、float、double)和原始音频数据本身。

在互联网上挖掘我发现了这个算法(更多 here ):

白噪声:

White Noise

算法

All you need to do is randomize every sample from –amplitude to amplitude. We don’t care about the number of channels in most cases so we just fill every sample with a new random number.

Random rnd = new Random();
short randomValue = 0;

for (int i = 0; i < numSamples; i++)
{
randomValue = Convert.ToInt16(rnd.Next(-amplitude, amplitude));
data.shortArray[i] = randomValue;
}

画的真好,但我不想那样画,但是这样:

audacity

关于我如何使用我拥有的信息进行绘图,是否有任何算法或想法?

最佳答案

每个人的解释我是 dj 应用程序的开发人员,正在寻找类似的答案。因此,我将解释所有关于您可能在包括 Audacity 在内的任何软件中看到的音乐波形的信息。

有 3 种类型的波形用于在任何音乐软件中显示。即样本、平均值和 RMS。

1) 样本是图表中呈现的实际音乐点,可以是一组原始音频数据(放大波形时看到的点)。

2) 平均:最常用,假设你在屏幕上显示 3 分钟的歌曲,那么屏幕上的单个点必须显示至少 100 毫秒(大约)的歌曲,其中有许多原始音频点,所以为了显示我们计算该 100 毫秒持续时间内所有点的平均值,其余轨道以此类推(大胆的深蓝色大波形)。

3) RMS:类似于平均值,但这里取的不是平均值,而是特定持续时间的均方根(蓝色波形中的浅蓝色小波形是 audacity 的均方根波形)。

现在如何计算波形。

1) 当您使用任何获得原始样本/点的技术解码歌曲时,样本是原始数据。现在根据点的格式将它们转换为 -1 到 1 的范围,例如,如果格式为 16 位,则将所有点除以 32768(16 位数的最大范围),然后绘制点。

2) 对于平均波形 - 首先将所有将负值转换为正值的点相加,然后乘以 2,然后取平均值。

//samples is the array and nb_samples is the length of array
float sum = 0;
for(int i = 0 ; i < nb_samples ; i++){
if(samples[i] < 0)
sum += -samples[i];
else
sum += samples[i];
}
float average_point = (sum * 2) / nb_samples; //average after multiplying by 2
//now draw this point

3) RMS:它简单地取均方根 - 所以首先对每个样本进行平方,然后取和,然后计算均值,然后计算平方根。我会在编程中展示

//samples is the array and nb_samples is the length of array
float squaredsum = 0;
for(int i = 0 ; i < nb_samples ; i++){
squaredsum += samples[i] * samples[i]; // square and sum
}
float mean = squaredsum / nb_samples; // calculated mean
float rms_point = Math.sqrt(mean); //now calculate square root in last
//now draw this point

注意这里的样本是点数组,用于计算特定歌曲持续时间的点/像素。例如,如果你想以 60 像素绘制 1 分钟的歌曲数据,那么样本数组将是 1 秒内所有点的数组,即要以 1 像素显示的音频点的数量。

希望这能帮助人们澄清有关音频波形的概念。

关于c++ - 从音频中绘制波形的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26663494/

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