gpt4 book ai didi

audio - 44100 的采样率究竟代表什么?

转载 作者:行者123 更新时间:2023-12-01 09:46:53 25 4
gpt4 key购买 nike

我正在使用 FMOD 库从 MP3 中提取 PCM。我得到了整个 2 channel - 16 位的东西,我还得到 44100hz 的采样率是 1 秒内 44,100 个“声音”样本。我不明白的是,16 位值到底代表什么。我知道如何在 xy 轴上绘制坐标,但我在绘制什么? y轴代表时间,x轴代表什么?声级?这与振幅相同吗?我如何确定构成此值的不同声音。我的意思是,如何从 16 位数字中获取频谱。

这可能是一个单独的问题,但它实际上是我真正需要回答的问题:如何获取每 25 毫秒的振幅?我是否将 44,100 个值除以 40(40 * 0.025 秒 = 1 秒)?这给出了 1102.5 个样本;那么我是否可以将 1102 个值输入一个黑匣子,让我及时得到那个时刻的振幅?

编辑原始帖子以添加我计划很快测试的代码:(注意,我将帧速率从 25 毫秒更改为 40 毫秒)

// 44100 / 25 frames = 1764 samples per frame -> 1764 * 2 channels * 2 bytes [16 bit sample] = 7056 bytes
private const int CHUNKSIZE = 7056;
uint bytesread = 0;
var squares = new double[CHUNKSIZE / 4];
const double scale = 1.0d / 32768.0d;

do
{
result = sound.readData(data, CHUNKSIZE, ref read);

Marshal.Copy(data, buffer, 0, CHUNKSIZE);

//PCM samples are 16 bit little endian
Array.Reverse(buffer);

for (var i = 0; i < buffer.Length; i += 4)
{
var avg = scale * (Math.Abs((double)BitConverter.ToInt16(buffer, i)) + Math.Abs((double)BitConverter.ToInt16(buffer, i + 2))) / 2.0d;
squares[i >> 2] = avg * avg;
}

var rmsAmplitude = ((int)(Math.Floor(Math.Sqrt(squares.Average()) * 32768.0d))).ToString("X2");

fs.Write(buffer, 0, (int) read);

bytesread += read;

statusBar.Text = "writing " + bytesread + " bytes of " + length + " to output.raw";
} while (result == FMOD.RESULT.OK && read == CHUNKSIZE);

加载 mp3 后,我的 rmsAmplitude 似乎在 3C00 到 4900 的范围内。我做错了什么吗?我期待更广泛的传播。

最佳答案

是的,样本代表振幅(在那个时间点)。

要获得频谱,您通常会将其从时域转换为频域。

最后一个问题:使用了多种方法 - 您可能需要 RMS .

关于audio - 44100 的采样率究竟代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10387845/

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