gpt4 book ai didi

c# - 如何在C#中计算波信号的混响时间

转载 作者:太空狗 更新时间:2023-10-29 19:47:10 26 4
gpt4 key购买 nike

我正在尝试用 C# 开发一个控制台应用程序,它使用 WAV 文件进行输入。应用程序应该按顺序做几件事,如下所示。先上完整代码:

class Program
{
static List<double> points = new List<double>();
static double maxValue = 0;
static double minValue = 1;
static int num = 0;
static int num2 = 0;
static List<double> values = new List<double>();
private static object akima;
static void Main(string[] args)
{
string[] fileLines = File.ReadAllLines(args[0]);
int count = 0;
foreach (string fileLine in fileLines)
{
if (!fileLine.Contains(";"))
{
string processLine = fileLine.Trim();
processLine = Regex.Replace(processLine, @"\s+", " ");
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
processLine = processLine.Replace(".", ",");
}
string[] dataParts = processLine.Split(Char.Parse(" "));
points.Add(double.Parse(dataParts[0]));
double value = Math.Pow(double.Parse(dataParts[1]), 2);
if (value > maxValue)
{
maxValue = value;
num = count;
}
values.Add(value);
}
count++;
}
for (int i = num; i < values.Count; i++)
{
if (values[i] < minValue)
{
minValue = values[i];
num2 = i;
}
}
Console.WriteLine(num + " " + num2);
int between = num2 - num;
points = points.GetRange(num, between);
values = values.GetRange(num, between);
List<double> defVal = new List<double>();
List<double> defValPoints = new List<double>();
alglib.spline1dinterpolant c;
alglib.spline1dbuildakima(points.ToArray(), values.ToArray(), out c);
double baseInt = alglib.spline1dintegrate(c, points[points.Count - 1]);
List<double> defETC = new List<double>();
for (int i = 0; i < points.Count; i += 10)
{
double toVal = points[i];
defETC.Add(10 * Math.Log10(values[i]));
defVal.Add(10 * Math.Log10((baseInt - alglib.spline1dintegrate(c, toVal)) / baseInt));
defValPoints.Add(points[i]);
}
WriteDoubleArrayToFile(defValPoints.ToArray(), defVal.ToArray(), "test.dat");
WriteDoubleArrayToFile(defValPoints.ToArray(), defETC.ToArray(), "etc.dat");
int end = 0;
for (int i = 0; i < points.Count; i++)
{
if (defVal[i] < -10)
{
end = i;
break;
}
}
//Console.WriteLine(num + " " + end);
int beginEDT = num;
int endEDT = num + end;
double timeBetween = (defValPoints[endEDT] - defValPoints[beginEDT]) * 6;
Console.WriteLine(timeBetween);
for (int i = 0; i < points.Count; i++)
{

}
Console.ReadLine();
}
static void WriteDoubleArrayToFile(double[] points, double[] values, string filename)
{
string[] defStr = new string[values.Length];
for (int i = 0; i < values.Length; i++)
{
defStr[i] = String.Format("{0,10}{1,25}", points[i], values[i]);
}
File.WriteAllLines(filename, defStr);
}
}
  1. 从 WAV 文件中提取小数/浮点/ double 值
  2. 从提取的数据创建一个数组
  3. 创建能量时间曲线,以类似分贝的方式显示噪音/声音的衰减
  4. 根据第 3 步中创建的 ETC 创建衰减曲线
  5. 根据此衰减曲线计算早期衰减时间 (EDT)、T15/T20 和 RT60。
  6. 在标准输出中显示这些混响时间。

目前,我的流程已进行到一半。我会解释我做了什么:

  1. 我使用 Sox 将音频文件转换为带有数字的 .dat 文件
  2. 我使用 C# 创建了一个数组,方法是简单地拆分上面文件中的每一行,并将时间放在 TimesArray 中,将这些点的值放在 ValuesArray 中。
  3. 我正在通过 GNUPlot 显示图表,使用通过此函数处理的数据:10 * Math.Log10(values[i]); (其中 i 是 for 循环中迭代 ValuesArray 中所有项目的迭代整数)
  4. 这是我开始卡住的地方。我的意思是,在这一步中,我使用 Alglib 中的 Akima 样条函数来集成一条线。我正在通过以下数学计算使用 Schroeder 积分(反向)进行此操作:10 * Math.Log10((baseInt - alglib.spline1dintegrate(c, toVal))/baseInt); (其中 baseInt 是作为完整曲线的基础积分计算的值,因此我计算了反向 Schroeder 积分的底部部分。c 是在使用函数 alglib.spline1dbuildakima 时可用的 spline1dinterpolant,它将 timeArray 作为 x值,valueArray 作为 y 值,c 作为向外的 spline1dinterpolant。toval 是点数组中的 x 值。使用 for 循环选择特定值。)从这些新保存的值我想创建一个插值线并从该行计算 RT60,但我不知道该怎么做。
  5. 尝试过,但没有真正解决。
  6. 同上,我没有真正的值(value)可以展示。

我现在很困惑,因为我不确定这是否是正确的方法。如果有人能告诉我如何在 C# 中以快速响应的方式计算混响时间,我将很高兴听到。这样做的方式可能与我现在的完全不同,没关系,告诉我!

最佳答案

也许您需要换种方式:

  1. 从基础数学开始。找出这些函数的数学公式。
  2. 使用简单的数学函数并手动计算(在 excel 或 matlab 中)值应该是多少(所有这些东西 ETC、DC、EDC、T15、T20、RT60)(一个函数,例如您需要的最少点数的正弦波)
  3. 然后编写一个单独的程序来评估 C# 中的每一个,并验证您的结果与 excel/matlab 的一致性。

在 C# 中,可能将数据存储在一个类中,您将其传递给每个方法以进行计算。

你的主要功能应该像这样结束:

main(){

data = new Data();

//1, 2:
extract_data(data, filename);

//3:
energy_time_curve(data)

//...4, 5

//6:
display_results(data);


}

关于c# - 如何在C#中计算波信号的混响时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14015334/

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