我的程序准备好进行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)将数据从时域转换到频域。现在我的困惑是:
- 我的列表中的数据以当前形式表示什么
- 我先读了很多关于采样信号的文章,但由于文件已经是数字格式的,所以我应该担心采样,因为我认为它只在ADC期间完成。另一方面,如果仍然需要这样做,那么我为什么要这样做,因为我已经在使用整个文件了
- 当前形式的数据是否已准备好进行FFT
- 在为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();
}
}
- 我的列表中的数据以当前形式表示什么
在其当前形式中,您将从文件中获取原始字节序列,但要明确删除的标头除外。原始字节和相应的数据采样值之间的映射通常是非平凡的,并且根据所选择的编码方案而变化。有关更多详细信息,请参阅本波形文件规范。
- 我先读了很多关于采样信号的文章,但由于文件已经是数字格式的,所以我应该担心采样,因为我认为它只在ADC期间完成。另一方面,如果仍然需要这样做,那么我为什么要这样做,因为我已经在使用整个文件了
事实上,波形文件包含数字采样的数据,因此您不必担心对这些数据进行采样。然而,您很可能需要了解这些数据是如何采样的,尤其是所使用的采样率。该信息包含在wav文件头中。
- 当前形式的数据是否已准备好进行FFT
简单地说,没有。正如我上面指出的,数据仍然是原始字节形式,使用CopyTo
尝试将原始字节转换为double
的数组并不能切断它
- 在为FFT准备数据时,我现在缺少了什么
您需要将原始字节序列转换为数据采样值。如果你自己做这件事,你必须考虑每个样本的位数、通道数量(如果你不处理单声道,则去交错通道)和编码格式(PCM、IEEE浮点等)。幸运的是,有几个库(如NAudio)可以为您执行此解码。或者,你可能想看看这篇文章的答案。