2014-10-08 72 views
0

这段代码应该带一个.wav文件,将原始数据转换为一个字节数组并将其转换为一个短阵列,然后转换为一个复杂数据。然后,我从复杂数字的长度小于5000的部分通过AForge.Math中的FFT进行填充。这些结果复数看起来是否正确?另外如果我以为freq和freq中的另一个放大器,我在这里是不正确的?FFT问题,输出是否正确?

以下是输出的几个例子:

(-2.16700013595762,0.68302023531242),(4.22590168063363,4.0661547909796),(-5.01069934509754,-0.16041726303182),(-1.46395152700116,-6.23087698868018),(-2.96017908067037, 0.439816425795027),

这是我的代码。

class Main 
{ 

    WaveFileReader reader; 
    short[] sample; 
    Complex[] tmpComplexArray; 

    public Main() 
    { 
     reader = new WaveFileReader("C:\\Users\\minford\\Downloads\\Adolf_Hitler_speeches_HD_English_Subtitles_.wav"); 

     byte[] buffer = new byte[reader.Length]; 
     reader.Read(buffer, 0 , buffer.Length); 
     sample = new short[reader.Length]; 
     for (int n = 0; n < buffer.Length; n += 2) 
     { 
      sample[n] = BitConverter.ToInt16(buffer, n); 

     } 


     //convert short to complex 
     Complex[] complexData = new Complex[sample.Length]; 
     for (int i = 0; i < complexData.Length; i++) 
     { 
      Complex tmp = new Complex(sample[i],0); 

      complexData[i] = tmp; 

     } 



     //to get first 500 for testing. 
     tmpComplexArray = new Complex[5000]; 
     int x = 0; 

     for (int i =50000; i < 55000; i++) 
     { 
      Complex a = new Complex(complexData[i]); 
      tmpComplexArray[x] = a; 
      x++; 
     } 


     //run FFT 
     FourierTransform.DFT(tmpComplexArray ,FourierTransform.Direction.Forward); 



     //print out sample of conversion 
     for (int i = 0; i < tmpComplexArray.Length; i++) 
     { 

      Console.Write(i+" :"+tmpComplexArray[i]+ ", "); 
     } 

     Console.Write("complete, "); 
    } 

} 

编辑:

我已经创建了一个正弦波并将其存储在短阵,我通过这成为一个复杂的阵列然后通过FFT。我的问题我不知道我在找什么结果。非常新的DSP

结果的一小部分是: (0,0),(2.21689333557151E-15,-7.34284855141709E-15),(-2.89901436190121E-15,-1.0077605416825E-14), (-6.53699316899292E-15,-5.64637225863862E-15),(-1.67688085639384E-14,-8.32711677389852E-15),(1.4495071809506E-14,4.91429119620079E-15),(1.8701484805205​​8E-14,2.4891200212096E-15) ),( - 2.48532752417959E-15,-1.7036594357478E-14),(-7.33280103304423E-15,8.1326056999842E-15) -14),(-1.00044417195022E-14,3.97015753605956E-14),(-1.53​​477230924182E-15,-2.25943708187515E-14),(-2.36468622460961E-14,8.33955127177433E-15),(4.03588273911737E-15) -3.4597213982579E-14),(-1.26192389870994E-14,-3.72946118432083E-15),(-1.9554136088118E-14,-2.36486386029355E-14),(-3.17754711431917E-14,3.335198535594827E -15),(-1.48929757415317E-14,-5.97566440774244E-14),(3.50723894371185E-14,-3.57420759655724E-14),(1.65414348884951E-14,4.11670697531008E-15),(-1.69393388205208E-14) 4.49968950988477E-14),(-2.01112015929539E-13,9.97060212171164E-14),(2.32660113397287E-13,1.59641189156901E-14)

赫雷什是我的代码:

 int sampleRate = 8000; 
     short[] buffer = new short[8000]; 
     double amplitude = 0.25 * short.MaxValue; 
     double frequency = 500; 
     for (int n = 0; n < buffer.Length; n++) 
     { 
      buffer[n] = (short)(amplitude * Math.Sin((2 * Math.PI * n * frequency) /sampleRate)); 
     } 

     Complex[] complexData = new Complex[buffer.Length]; 
      for (int i = 0; i < buffer.Length; i++) 
     { 
      Complex tmp = new Complex(buffer[i],0); 

      complexData[i] = tmp; 

      } 



     FourierTransform.DFT(complexData ,FourierTransform.Direction.Forward); 



     //print out sample of conversion 
     for (int i = 0; i < complexData.Length; i++) 
     { 

      Console.Write(i+" :"+complexData[i]+ ", "); 
     } 

     Console.Write("complete, "); 

编辑:

我正在正确的垃圾桶中获得加标。我看到你提到的两个,因为它们是镜像的。你能解释为什么会发生这种情况吗?

+0

特有的音频文件 – Stefan 2014-10-08 12:25:50

+0

的确,我的目标是分析着名的演讲。我开始与3位温斯顿丘吉尔,德怀特D.艾森豪威尔和阿道夫希特勒进行测试。 – 2014-10-08 12:29:41

+0

很难判断这些值是否应该是您所期望的。复数包含有关音轨中某个正弦和哪个相位存在多少的信息。要获得“幅度”,您需要获取复数值的模数。数组中的位置表示频率,但取决于采样率和其他属性(不能直接记住)。所以,正如Willeman所说,最好检查一下你的结果是否是一个简单的正弦。 – Stefan 2014-10-08 12:41:13

回答

1

这里有两个问题:

1)您需要将您的数据归一化为-1.0到1.0的范围。否则Aforge DFT算法会溢出。

Complex[] complexData = new Complex[buffer.Length]; 
for (int i = 0; i < buffer.Length; i++) 
{ 
    Complex tmp = new Complex(buffer[i]/(double)short.MaxValue, 0); 
    complexData[i] = tmp; 
} 

2)如果您查看复数的幅度,您将能够更容易地看到峰值。

for (int i = 0; i < complexData.Length; i++) 
{ 
    Console.Write(i+" :"+complexData[i].Magnitude+ ", "); 
} 

由于您的DFT长度为8000,因此每个bin的宽度为1Hz。因此,500Hz正弦波的峰值将在分箱500中。

2

我会从最简单的情况开始(频率为'x'的正弦波),并验证在获取FFT输出的实际值时,您在与x对应的频率点处出现尖峰。如果这样做,那么你可以开始担心在复数中表示的相位信息。