gpt4 book ai didi

c# - 分析wav并绘制图形

转载 作者:太空狗 更新时间:2023-10-29 17:46:45 25 4
gpt4 key购买 nike

我正在尝试从一个 wav 文件中打印出一个 wave,但我有点迷失了样本的长度。

这是我想要实现的(没有颜色): Music wav

因此,为了读取我的数据,我使用以下代码:

// first we need to read our wav file, so we can get our info:
byte[] wav = File.ReadAllBytes(filename);

// then we are going to get our file's info
info.NumChannnels = wav[22];
info.SampleRate = bytesToInt(wav[24], wav[25]);

// nr of samples is the length - the 44 bytes that where needed for the offset
int samples = (wav.Length - 44) / 2;

// if there are 2 channels, we need to devide the nr of sample in 2
if (info.NumChannnels == 2) samples /= 2;

// create the array
leftChannel = new List<float>();
if (info.NumChannnels == 2) rightChannel = new List<float>();
else rightChannel = null;

int pos = 44; // start of data chunk
for (int i = 0; i < samples; i++) {
leftChannel.Add(bytesToFloat(wav[pos], wav[pos + 1]));
pos += 2;
if (info.NumChannnels == 2) {
rightChannel.Add(bytesToFloat(wav[pos], wav[pos + 1]));
pos += 2;
}
}

BytesToFloat = 将 2 个字节转换为 -1 到 1 之间的 float

所以现在我有 2 个数据列表,但是现在我应该如何创建 1 行我应该使用多少个数字?

最让我困惑的是:当你播放一首歌时,你可以在大多数音乐播放器中看到以下数据,这在我看来是 1 个样本的表示。 enter image description here

但是你怎么知道每个条的值,以及样本中有多少个条

最佳答案

您的问题是关于两种不同的音频可视化。要绘制波形,您发布的代码已接近准备好从中绘制,但您正在为每个样本添加一个条目到您的列表中。由于音频通常是每秒 44100 个样本,因此一首 3 分钟歌曲的波形将需要近 800 万像素。所以你要做的是将它们分批处理。对于每 4410 个像素(即 100 毫秒),找到具有最高和最低值的那个,然后用它来画线。事实上,您通常只需找到最大 Abs 值并绘制对称波形即可。

下面是一些代码,用于在 WPF 中绘制音频文件的基本 WaveForm,使用 NAudio 可以更轻松地访问样本值(它可以处理 WAV 或 MP3 文件)。我没有包括任何左右声道的分离,但这应该很容易添加:

var window = new Window();
var canvas = new Canvas();
using(var reader = new AudioFileReader(file))
{
var samples = reader.Length / (reader.WaveFormat.Channels * reader.WaveFormat.BitsPerSample / 8);
var f = 0.0f;
var max = 0.0f;
// waveform will be a maximum of 4000 pixels wide:
var batch = (int)Math.Max(40, samples / 4000);
var mid = 100;
var yScale = 100;
float[] buffer = new float[batch];
int read;
var xPos = 0;
while((read = reader.Read(buffer,0,batch)) == batch)
{
for(int n = 0; n < read; n++)
{
max = Math.Max(Math.Abs(buffer[n]), max);
}
var line = new Line();
line.X1 = xPos;
line.X2 = xPos;
line.Y1 = mid + (max * yScale);
line.Y2 = mid - (max * yScale);
line.StrokeThickness = 1;
line.Stroke = Brushes.DarkGray;
canvas.Children.Add(line);
max = 0;
xPos++;
}
canvas.Width = xPos;
canvas.Height = mid * 2;
}
window.Height = 260;
var scrollViewer = new ScrollViewer();
scrollViewer.Content = canvas;
scrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
window.Content = scrollViewer;
window.ShowDialog();

第二种可视化有时称为频谱图或频谱分析仪。它不代表 1 个样本,而是代表样本 block 中存在的频率。要获得此信息,您需要通过快速傅里叶变换 (FFT) 传递样本。通常你通过 1024 个样本 block (它应该是 2 的幂)。不幸的是,如果您是 DSP 新手,FFT 可能很难使用,因为您需要学习几件事情:

  • 应用窗口函数
  • 将您的音频转换为正确的输入格式(许多 FFT 期望输入为复数)
  • 计算出哪个 bin 编号对应于哪个频率,
  • 找到每个箱子的大小并将其转换为分贝标度。

您应该能够在 StackOverflow 上找到关于每个主题的更多信息。我在 this article 中写了一些关于如何在 C# 中使用 FFT 的内容。 .

关于c# - 分析wav并绘制图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13629277/

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