C# 如何在C语言中计算波信号的混响时间#
我正在尝试用C#开发一个控制台应用程序,它使用WAV文件作为输入。应用程序应该按顺序完成几件事情,如下所示。首先,完整的代码:C# 如何在C语言中计算波信号的混响时间#,c#,.net,audio,signal-processing,C#,.net,Audio,Signal Processing,我正在尝试用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&
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);
}
}
类程序
{
静态列表点=新列表();
静态双maxValue=0;
静态双最小值=1;
静态int num=0;
静态int num2=0;
静态列表值=新列表();
私有静态对象akima;
静态void Main(字符串[]参数)
{
string[]fileLines=File.ReadAllLines(args[0]);
整数计数=0;
foreach(文件行中的字符串文件行)
{
如果(!fileLine.Contains(“;”)
{
字符串processLine=fileLine.Trim();
processLine=Regex.Replace(processLine,@“\s+”,“”);
if(Environment.OSVersion.PlatformID==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);
如果(值>最大值)
{
最大值=最大值;
num=计数;
}
增加(价值);
}
计数++;
}
for(int i=num;i
我现在被卡住了,因为我不确定这样做是否正确。如果有人能告诉我如何用C#快速、灵敏地计算混响时间,我很乐意听到。这样做的方式可能与我现在拥有的完全不同,没关系,只要让我知道 也许你需要以不同的方式来处理这个问题:
main(){
data = new Data();
//1, 2:
extract_data(data, filename);
//3:
energy_time_curve(data)
//...4, 5
//6:
display_results(data);
}