我有一个浮点数组,我从传感器得到,并希望在通过FFT运行信号后得到幅度(在此之前,使用高通滤波器和Hann窗函数处理样本).
使用AForge.Math库FFT类,它将复数数组作为参数,我提出了以下代码:
Complex[] complex = new Complex[1024];
for (int i = 0; i < 1024 - 1; i++)
{
complex[i] = new Complex(windowedSamples[i], 0);
}
FourierTransform.FFT(complex, FourierTransform.Direction.Forward);
return complex.Select(x => Math.Sqrt(Math.Sqrt(x.Re) + Math.Sqrt(x.Im))).ToArray();
Run Code Online (Sandbox Code Playgroud)
运行这个我得到了一些奇怪的结果,并且无法锁定问题.
前10个输入值:
0 0 -3.8454E-05 0.0001737584 0.0006910793 0.001071334 0.00204984 0.00276812 0.001741312 0.001796867
前10个输出值:
0.482303347948843 0.706458195192639 NaN NaN NaN NaN NaN NaN NaN NaN
我的第一个猜测是它可能是想象中的部分,但到目前为止,我读过的所有内容都说在这种情况下它应该设置为0.
我真的很感激帮助解决这个问题.
我正在使用 Libgdx 库对 Android 应用程序中的加速度计信号进行 FFT。
我需要对信号进行归一化,因为我找到两个信号的点积,并且我希望其最大值为 1。
对于“归一化”,我的意思是信号的欧几里得范数是1。(欧几里得范数是向量模拟分量的乘积之和的平方根。当我找到它的值时,为了归一化信号,我将向量的所有分量除以标准值)。
点积位于频谱中,因此如果我在时域中对信号进行归一化,则频谱表示不是欧几里德归一化,那么我将再次进行欧几里德归一化。(我已经考虑在 FFT 之后按 1/N比例因子进行归一化,我认为这可能不会影响我的问题)。
如果我在 FFT 之前和之后进行欧几里得归一化,或者仅在 FFT 之后进行欧几里得归一化,会有什么区别?
编辑1:还要考虑Libgdx库中的FFT是复杂的DFT,并且我在输入中有真实信号,而输出信号对于0到(N/2)-1和N/2到N是对称的。我验证了Parseval定理如果我不应用窗口(如汉明窗口),则验证。那么,如果我使用 0 到 N/2-1 信号分量,我会得到 0 到 1 之间的点积吗?
在进行逆FFT时,我有以下代码有错误.正向FFT工作,因为我打印输出并验证它.但反过来似乎没有.有任何想法吗?看起来我错过了一个概念吗?
代码 - http://pastebin.com/iZYtdcqR
编辑 - 我基本上重写了CUDA工具包示例附带的代码.我试图使用FFT但使用修改后的算法(实际上是DIF)执行卷积.
EDIT2 - 问题的dding代码.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <cuda_runtime.h>
#include <cufft.h>
typedef enum signaltype {REAL, COMPLEX} signal;
typedef float2 Complex;
void
printData(Complex *a, int size, char *msg) {
if (msg == "") printf("\n");
else printf("%s\n", msg);
for (int i = 0; i < size; i++)
printf("%f %f\n", a[i].x, a[i].y);
}
void
normData(Complex *a, int size, float norm) {
for (int i = 0; i < size; i++) {
a[i].x /= norm; …Run Code Online (Sandbox Code Playgroud) 我试图了解我想要分析的一系列图像中存在的空间频率。我决定用这个numpy.fft.fft2函数来做到这一点,但显然无法绘制输出 - 你能帮我找出问题所在吗?
显然发生这种情况是因为输出包含0.+0.jmatplotlib 无法处理的值。但我不知道如何将它们更改为它可以处理的东西。
这是我的问题的一个最小示例。
我听说/读过,如果我们有一些n FFT 来执行一些m 个向量,我们可以使用 cuFFT 的批处理模式。所以为了测试它,我制作了一个示例程序并运行它。我使用的数据是一个文件,其中包含一些1024浮点数,因为相同的1024数字重复了10多次。虽然1024点 FFT应该得到相同的结果,但我没有得到。如果我在某处概念上有错误,请纠正我,下面是代码,如果你能纠正我犯的一些错误。
注意:我只使用 1D FFT。
这是代码片段:
#include <cuda.h>
#include <cufft.h>
#include <stdio.h>
#include <math.h>
#define NX 1024
#define DATASIZE 1024
#define BATCH 10
int main (int argc, char* argv[])
{
cufftHandle plan;
cufftComplex *deviceOutputData, *hostOutputData;
cufftReal *hostInputData, *deviceInputData;
int i,j;
FILE *in; // *out, *fp;
cudaMalloc ((void**)&deviceInputData, NX*BATCH*sizeof(cufftReal));
hostInputData = (cufftReal*) malloc (NX*BATCH*sizeof(cufftReal));
cudaMalloc ((void**)&deviceOutputData, NX*BATCH*sizeof(cufftComplex));
hostOutputData = (cufftComplex*) malloc (NX*BATCH*sizeof(cufftComplex));
in = fopen …Run Code Online (Sandbox Code Playgroud) 我想找到持续时间为10秒的音频信号的4096点DFT,采样率为44100 Hz.因此,有441000个输入样本.但KissFFT最多只需4096作为输入大小.如何查找如此大信号的FFT?
所以,我想创建一个 1.95Khz 信号,这很简单。
N=1024
Run Code Online (Sandbox Code Playgroud)
signal=[np.sin(2*np.pi*i/512)*20000+30000 for i in np.arange(0,N,1)]
至少有 2 个周期。我如何使用 96Khz 的采样频率模拟我正在读回它。我想要 1024 个样本。另外,当我发送它时,每个点每 1040ns 发送一次(信号数组的每个元素每 1040ns 发送一次)。
我正在尝试用 C++ 制作均衡器。我必须以(通常)256 个样本的块来处理音频。我使用 FFT 来获取样本块的频谱。我处理频率,然后使用 IFFT 获取时域中处理后的音频块。我正在使用相关问题中提供的代码:FFT in a single C-file。
对于低通滤波器,将较低系数设置为零应该可以消除低频。然而,在处理后的音频中,我得到的是变化的频谱,而不是低通滤波器(音频包含嗡嗡声)。
我已阅读以下相关文章:
我做错了什么吗?块大小是否太小而无法获得合理的频率分辨率?
我熟悉傅里叶变换的数学原理。但是,我不知道 FFT 和 IFFT 变换的细节。所提供的代码可能未正确实现。然而,当完成 FFT,然后对 FFT 结果进行 IFFT 时,原始音频块被正确重建。
我正在编写一个 VST,并在该方法中进行所有处理processReplacing()。这就是为什么我受到块大小的限制。
我的想法是将最后n块保留在内存中,并对最后n块计算FFT以获得更高的频率分辨率,然后对这些频率进行处理,在IFFT之后,仅替换最后一个块。
对于这是否是实现均衡器的正确方法有什么建议吗?
我有一个样本间隔(时间)不均匀的数据。我怎样才能找到信号的 FFT 并绘制它。
有人告诉我这属于编程,而不是信号处理子交换。
有没有办法在 Windows 中对实时音频实施频谱分析(特别是 FFT)?
我希望能够从麦克风中读取音频,并在屏幕上显示结果傅立叶变换。
如果发生一组特定的 FFT 特征,我可以执行程序也会很有用。
谢谢你们!
我正在编写一个"简单"代码来进行FFT.主要问题发生在DLpart部分:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <complex>
#include <algorithm>
#define SWAP(a,b) tempr=(a);(a) = (b); (b) = tempr
//although maybe i should make my own swap function rather than a define swap
using namespace std;
vector<double> bitReversal(vector<double> data, int nn,int* j);
vector<double> Xcreator(double xSteps);
vector< double > DLpart(vector<double> data,int nn,int j);
void arrayGuarder (vector<double>totals, string fileName,double xSteps);
vector<double> cosineCrafter(double xSteps,double numWaves);
main(int argc, char **argv){
vector<double> input;
int j = 1; …Run Code Online (Sandbox Code Playgroud) 我想得到一个字节数组中音频字节的音高.这是我现在的代码:
byte[] wav = File.ReadAllBytes("test.wav");
for (int i = 44; i<wav.Length; i++)
{
// wav[i] is an audio byte, channel shifts every 2 bytes (I think)
}
Run Code Online (Sandbox Code Playgroud)
起初我认为wav文件是用数百或数千个块构建的,每个块都包含一个采样率,所以我试图扫描整个数组中的另一个字节序列,代表单词"WAVE",它是一个部分.块,但采样率仅在数组的开头,并且在44位之后,所有数组都只是音频数据本身.
音频字节只是十六进制值,我无法理解如何从该值获取任何信息.
更新:我已经下载了具有FFT算法的Math.NET库.这是FFT的文档:https://numerics.mathdotnet.com/api/MathNet.Numerics.IntegralTransforms/Fourier.htm 我已经阅读了所有的方法,但我不知道什么方法会做我想要的(给它几个字节的wav文件并获得它们的频率).
更新2:现在我使用Accord库进行FFT,我在youtube上找到了一个教程.这是我将音频字节转换为双数组的代码:
for (int i = 44; i<wav.Length; i+=BufferSize)
{
float currentSec = (float) audioLength / wav.Length * i;
byte[] buffer = new byte[BufferSize];
for (int j = 0; j < buffer.Length; j++)
{
if ((i + j + 1) < wav.Length)
buffer[j] = wav[i + j]; …Run Code Online (Sandbox Code Playgroud)