标签: fft

1D FFT的输入

我有一个浮点数组,我从传感器得到,并希望在通过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.

我真的很感激帮助解决这个问题.

.net c# math signal-processing fft

0
推荐指数
1
解决办法
1112
查看次数

FFT 之前或之后标准化信号有何区别?

我正在使用 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 之间的点积吗?

android signal-processing fft normalization libgdx

0
推荐指数
1
解决办法
4718
查看次数

CUDA逆FFT错误

在进行逆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)

cuda fft ifft

0
推荐指数
1
解决办法
965
查看次数

绘制 numpy.fft.fft2 输出

我试图了解我想要分析的一系列图像中存在的空间频率。我决定用这个numpy.fft.fft2函数来做到这一点,但显然无法绘制输出 - 你能帮我找出问题所在吗?

显然发生这种情况是因为输出包含0.+0.jmatplotlib 无法处理的值。但我不知道如何将它们更改为它可以处理的东西。

这是我的问题的一个最小示例

python numpy fft matplotlib

0
推荐指数
1
解决办法
1177
查看次数

真实数组的一维批处理 FFT

我听说/读过,如果我们有一些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)

cuda fft fftw cufft

0
推荐指数
1
解决办法
2614
查看次数

向KissFFT提供大量样品

我想找到持续时间为10秒的音频信号的4096点DFT,采样率为44100 Hz.因此,有441000个输入样本.但KissFFT最多只需4096作为输入大小.如何查找如此大信号的FFT?

audio signal-processing fft kissfft

0
推荐指数
1
解决办法
255
查看次数

创建正弦波并在 python 中对其进行采样

所以,我想创建一个 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 发送一次)。

python numpy fft

0
推荐指数
1
解决办法
1万
查看次数

音频均衡分辨率

简而言之

我正在尝试用 C++ 制作均衡器。我必须以(通常)256 个样本的块来处理音频。我使用 FFT 来获取样本块的频谱。我处理频率,然后使用 IFFT 获取时域中处理后的音频块。我正在使用相关问题中提供的代码:FFT in a single C-file

对于低通滤波器,将较低系数设置为零应该可以消除低频。然而,在处理后的音频中,我得到的是变化的频谱,而不是低通滤波器(音频包含嗡嗡声)。

我已阅读以下相关文章:

我做错了什么吗?块大小是否太小而无法获得合理的频率分辨率?

我熟悉傅里叶变换的数学原理。但是,我不知道 FFT 和 IFFT 变换的细节。所提供的代码可能未正确实现。然而,当完成 FFT,然后对 FFT 结果进行 IFFT 时,原始音频块被正确重建。

细节

我正在编写一个 VST,并在该方法中进行所有处理processReplacing()。这就是为什么我受到块大小的限制。

我的想法是将最后n块保留在内存中,并对最后n块计算FFT以获得更高的频率分辨率,然后对这些频率进行处理,在IFFT之后,仅替换最后一个块。

对于这是否是实现均衡器的正确方法有什么建议吗?

c++ audio fft vst

0
推荐指数
1
解决办法
3379
查看次数

如何在python3中找到不均匀采样信号的FFT?

我有一个样本间隔(时间)不均匀的数据。我怎样才能找到信号的 FFT 并绘制它。

python signals signal-processing fft python-3.x

0
推荐指数
1
解决办法
4707
查看次数

实时输入音频上的信号处理/FFT

有人告诉我这属于编程,而不是信号处理子交换。

有没有办法在 Windows 中对实时音频实施频谱分析(特别是 FFT)?

我希望能够从麦克风中读取音频,并在屏幕上显示结果傅立叶变换。

如果发生一组特定的 FFT 特征,我可以执行程序也会很有用。

谢谢你们!

windows signal-processing fft real-time

0
推荐指数
1
解决办法
2122
查看次数

奇怪的malloc:内存损坏

我正在编写一个"简单"代码来进行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)

c++ malloc fft corruption

-1
推荐指数
1
解决办法
2445
查看次数

从阵列中的音频字节获取音高或幅度等信息

我想得到一个字节数组中音频字节的音高.这是我现在的代码:

        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)

c# audio fft

-2
推荐指数
1
解决办法
658
查看次数