这段代码应该带一个.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.87014848052058E-14,2.4891200212096E-15) ),( - 2.48532752417959E-15,-1.7036594357478E-14),(-7.33280103304423E-15,8.1326056999842E-15) -14),(-1.00044417195022E-14,3.97015753605956E-14),(-1.53477230924182E-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, ");
编辑:
我正在正确的垃圾桶中获得加标。我看到你提到的两个,因为它们是镜像的。你能解释为什么会发生这种情况吗?
特有的音频文件 – Stefan 2014-10-08 12:25:50
的确,我的目标是分析着名的演讲。我开始与3位温斯顿丘吉尔,德怀特D.艾森豪威尔和阿道夫希特勒进行测试。 – 2014-10-08 12:29:41
很难判断这些值是否应该是您所期望的。复数包含有关音轨中某个正弦和哪个相位存在多少的信息。要获得“幅度”,您需要获取复数值的模数。数组中的位置表示频率,但取决于采样率和其他属性(不能直接记住)。所以,正如Willeman所说,最好检查一下你的结果是否是一个简单的正弦。 – Stefan 2014-10-08 12:41:13