C# 这一正常化过程的反面是什么?我怎样才能去规范化它?例如,如果我规范化一组音频样本,取其FFT,应用一些增益,然后IFFT,我如何对结果进行反规范化?保存规范化时得到的最大值,然后在处理后,再次规范化数据,但不要使用32767作为峰值,而是使用最大值 byt

C# 这一正常化过程的反面是什么?我怎样才能去规范化它?例如,如果我规范化一组音频样本,取其FFT,应用一些增益,然后IFFT,我如何对结果进行反规范化?保存规范化时得到的最大值,然后在处理后,再次规范化数据,但不要使用32767作为峰值,而是使用最大值 byt,c#,audio,floating-point,bytearray,normalization,C#,Audio,Floating Point,Bytearray,Normalization,这一正常化过程的反面是什么?我怎样才能去规范化它?例如,如果我规范化一组音频样本,取其FFT,应用一些增益,然后IFFT,我如何对结果进行反规范化?保存规范化时得到的最大值,然后在处理后,再次规范化数据,但不要使用32767作为峰值,而是使用最大值 byte[] data = ar.ReadData(); byte[] temp=new byte[data.Length]; float biggest= 0; ; for (int i = 0; i < data.Length; i++)


这一正常化过程的反面是什么?我怎样才能去规范化它?例如,如果我规范化一组音频样本,取其FFT,应用一些增益,然后IFFT,我如何对结果进行反规范化?保存规范化时得到的
最大值
,然后在处理后,再次规范化数据,但不要使用32767作为峰值,而是使用
最大值
byte[] data = ar.ReadData();
byte[] temp=new byte[data.Length];
float biggest= 0; ;
for (int i = 0; i < data.Length; i++)
{
    if (data[i] > biggest)
    {
        biggest= data[i];
    }
}
for (int i = 0; i < data.Length; i++)
{
    temp = BitConverter.GetBytes(data[i] * (1 / biggest));
}
float[] floats = new float[] { 0.43f, 0.45f, 0.47f };
byte[] result = new byte[sizeof(float) * floats.Length];
Buffer.BlockCopy(floats, 0, result, 0, result.Length);
float number = 0.43f;
byte[] array = BitConverter.GetBytes(number);
    byte[] data = new byte[] { 1, 3, 5, 7, 9 };  // sample data
    IList<byte[]> temp = new List<byte[]>(data.Length);
    float biggest = 0; ;

    for (int i = 0; i < data.Length; i++)
    {
        if (data[i] > biggest)
            biggest = data[i];
    }

    for (int i = 0; i < data.Length; i++)
    {
        temp.Add(BitConverter.GetBytes(data[i] * (1 / biggest)));
    }
   byte | 01 02 | 03 04 | 05 06 | 07 08 | 09 10 | 11 12 | ...
channel |  Left | Right | Left  | Right | Left |  Right | ...
  frame |     First     |    Second     |     Third     | ...
 sample | 1st L | 1st R | 2nd L | 2nd R | 3rd L | 3rd R | ... etc.
short GetShortFromLittleEndianBytes(byte[] data, int startIndex)
{
    return (short)((data[startIndex + 1] << 8)
         | data[startIndex]);
}

byte[] GetLittleEndianBytesFromShort(short data)
{
    byte[] b = new byte[2];
    b[0] = (byte)data;
    b[1] = (byte)(data >> 8 & 0xFF);
    return b;
}
byte[] input = ar.ReadData();  // the function you used above
float biggest = -32768F;
float sample;
for (int i = 0; i < input.Length; i += 2)
{
    sample = (float)GetShortFromLittleEndianBytes(input, i);
    if (sample > biggest) biggest = sample;
}
float offset = 32767 - biggest;

float[] data = new float[input.length / 2];
for (int i = 0; i < input.Length; i += 2)
{
    data[i / 2] = (float)GetShortFromLittleEndianBytes(input, i) + offset;
}
byte[] output = new byte[input.Length];
for (int i = 0; i < output.Length; i += 2)
{
    byte[] tmp = GetLittleEndianBytesFromShort(Convert.ToInt16(data[i / 2]));
    output[i] = tmp[0];
    output[i + 1] = tmp[1];
}
if (Math.Abs(sample) > biggest) biggest = sample;
if (Math.Abs(sample) > biggest) biggest = Math.Abs(sample);