我的程序准备好进行FFT了吗

本文关键字:FFT 了吗 程序 准备好 我的 | 更新日期: 2023-09-27 18:19:58

我必须制作一个简单的模块,在那里我得到一个长度最多为3秒的.wav文件,然后我必须首先提取Amplitudes&然后从该文件中选择频率。我通过创建一个wave文件流,然后读取&同时将数据添加到列表中(但将其命名为arr),如下所示:

    do                                                                                          
    { i = wav.ReadByte(); if (i != -1) { arr.Add(i); } }                                         
    while (i != -1); Console.WriteLine(arr.Count); Console.ReadLine();   

然后从第44位开始,我要么在控制台上打印这些信息,要么将其转储到文本文件中。现在我看到的是0-255之间的整数。我知道为了获得频率,我必须使用快速傅立叶变换(FFT)将数据从时域转换到频域。现在我的困惑是:

  1. 我的列表中的数据以当前形式表示什么
  2. 我先读了很多关于采样信号的文章,但由于文件已经是数字格式的,所以我应该担心采样,因为我认为它只在ADC期间完成。另一方面,如果仍然需要这样做,那么我为什么要这样做,因为我已经在使用整个文件了
  3. 当前形式的数据是否已准备好进行FFT
  4. 在为FFT准备数据时,我现在缺少了什么

现在我只需要一个简单的方法来获取频率。稍后,如果被要求,我将添加更详细的数据提取。

我一直在研究声音处理的理论部分。但是,没有一本书或文章确切地显示FFT数据的准备情况。我发现了一些有用的链接:
在c#中导入.wav文件并提取信号一个双精度数组
如何在c#
中获取声音数据采样值在阵列中存储wav文件

这篇文章支持我的逻辑,即仅在ADC期间需要采样
http://www.relisoft.com/science/physics/sampling.html

下面的代码不是为了让公众看到,因为现在它包含了很多冗余,我在不同的地方引入了这些冗余,以便可视化每个步骤的输出。

class MyClass
{
  static void Main(string[] args)
  {
    string path = @"C:'wav_samples'"; 
    Console.WriteLine("Select a song between 1 to 10");
    string choice = Console.ReadLine();
    string finalpath = path + choice+".wav";
    //Creating a Stream for my .WAV File
    FileStream wav = new FileStream(finalpath , FileMode.Open);
    /*Declaring the ints & the list for the storage of bytes from the Stream for FFT */
    int i;
    List<double> arr = new List<double>();

    ///////////////////////////////////////////////////////////////////////////////////////////////
    /*Reading Bytes from the .WAV File & then printing out the corresponding integer values */
    do                                                                                          
    { i = wav.ReadByte(); 
        if (i != -1)                                                                                            
        { arr.Add(i); } }                                                                       
    while (i != -1); Console.WriteLine(arr.Count); Console.ReadLine();                          
    ////////////////////////////////////////////////////////////////////////////////
    //*Removing first 44 bytes of data as they include header information & other metadata*/
    arr.RemoveRange(0, 44);
    /*No method to find the size of list hence copying the data of list to a new array*/
    double[] storage = new double[arr.Count];
    arr.CopyTo(storage);
    Console.WriteLine(storage.LongLength);
    //Dumping results on screen or in a text file
    Console.WriteLine("Do you want to get results on the screen, press 1 for yes or 2 for dumping this in a text_file in wav_sample folder");
    int a = Convert.ToInt16(Console.ReadLine());
    if (a == 1) 
    {
        for (int limit = 0; limit < storage.LongLength; limit++ )
            Console.WriteLine(arr[limit]);
    }
    if (a == 2)
    {
        System.IO.StreamWriter file = new System.IO.StreamWriter(path +            "Results.txt", true);
        for (int limit = 0; limit < storage.LongLength; limit++ )
        { file.WriteLine( storage[limit] ); }
    }
    Console.ReadLine();
  }
}

我的程序准备好进行FFT了吗

  1. 我的列表中的数据以当前形式表示什么

在其当前形式中,您将从文件中获取原始字节序列,但要明确删除的标头除外。原始字节和相应的数据采样值之间的映射通常是非平凡的,并且根据所选择的编码方案而变化。有关更多详细信息,请参阅本波形文件规范。

  1. 我先读了很多关于采样信号的文章,但由于文件已经是数字格式的,所以我应该担心采样,因为我认为它只在ADC期间完成。另一方面,如果仍然需要这样做,那么我为什么要这样做,因为我已经在使用整个文件了

事实上,波形文件包含数字采样的数据,因此您不必担心对这些数据进行采样。然而,您很可能需要了解这些数据是如何采样的,尤其是所使用的采样率。该信息包含在wav文件头中。

  1. 当前形式的数据是否已准备好进行FFT

简单地说,没有。正如我上面指出的,数据仍然是原始字节形式,使用CopyTo尝试将原始字节转换为double的数组并不能切断它

  1. 在为FFT准备数据时,我现在缺少了什么

您需要将原始字节序列转换为数据采样值。如果你自己做这件事,你必须考虑每个样本的位数、通道数量(如果你不处理单声道,则去交错通道)和编码格式(PCM、IEEE浮点等)。幸运的是,有几个库(如NAudio)可以为您执行此解码。或者,你可能想看看这篇文章的答案。