标签: fft

傅立叶级数变换恢复原始信号

假设我有三个复杂波形(由许多正弦波组成):A,B和C.每个波形具有以下频率:分别为550,600,700 Hz.

现在我添加三个信号,即进行叠加以获得信号D.

我的目标是分别取回三个原始信号A,B和C.

我已经绘制了傅立叶光谱,在那里我获得了550,660和700 Hz的主峰.还有其他较小的山峰.我如何知道哪些波峰与哪些波形相关联,以便重新创建原始波形A,B和C?谢谢.

signals fft transform spectrum

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

使用傅里叶分析来拟合数据功能

我有Y的24个值,Y值的相应24个值是通过实验测量的,

而t有值: t=[1,2,3........24]

我想用傅里叶分析找到Y和t之间的关系,

我尝试和做过的是:

我写了以下MATLAB代码:

Y=[10.6534
    9.6646
    8.7137
    8.2863
    8.2863
    8.7137
    9.0000
    9.5726
   11.0000
   12.7137
   13.4274
   13.2863
   13.0000
   12.7137
   12.5726
   13.5726
   15.7137
   17.4274
   18.0000
   18.0000
   17.4274
   15.7137
   14.0297
   12.4345];

ts=1; % step

t=1:ts:24; % the period is 24 

f=[-length(t)/2:length(t)/2-1]/(length(t)*ts); % computing frequency interval

M=abs(fftshift(fft(Y)));

figure;plot(f,M,'LineWidth',1.5);grid % plot of harmonic components

figure;

plot(t,Y,'LineWidth',1.5);grid % plot of original data Y

figure;bar(f,M);grid % plot of harmonic components as bar shape
Run Code Online (Sandbox Code Playgroud)

条形图的结果是:

在此输入图像描述

现在,我想找到代表数据的这些谐波分量的等式.之后我想用拟合函数中找到的数据绘制原始数据Y,两条曲线应该彼此接近.

我应该使用cos或sin或-sin还是-cos?

换句话说,将这些谐波表示为函数的规则是什么Y = f (t)

algorithm math matlab fft

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

FFT +短期窗口:混乱

我使用0.025s长Hamming窗口和32768点FFT(?)来计算44100Hz采样音频信号的频谱,这是我的困惑:

  • 44100*0.025~ = 1103样品,<< N = 32768,
  • 但我的经验是,这个高N参数显着提高了光谱的分辨率.

所以我的问题是会发生什么?

这个令人敬畏的解释我得出结论,32768点FFT通常意味着它意味着1秒间隔,并且确实Voicebox的rfft函数(我使用的)提到它截断/将样本填充到N.所以我假设它填充了我的小的1103向量,0到32768长向量,能够计算FFT.

嗯,这真的发生了吗?这可以改善分辨率,虽然只有信号的前1/32是非零的吗?(好吧,我想是的,但我想确定,因为这出现在论文辩护上 - 我现在就得到了这个想法,写这篇文章).

感谢您的任何反馈.

signal-processing fft

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

使用FFT(FFTW)计算两个函数的卷积

我正在尝试使用FFT加速神经模拟器的计算.

等式是:

(1)\ sum(j = 1到N)(w(i-j)*s_NMDA [j])

其中s_NMDA是长度为N的向量,w由以下定义:

(2)W(j)的双曲正切= [1 /(2*西格玛*P)]*EXP(-abs(J)/(西格玛*P)]

sigma和p是常量.

(有没有更好的方法在stackoverflow上呈现方程?)

必须对N个神经元进行计算.由于(1)仅取决于绝对距离abs(i-j),因此应该可以使用FFT(卷积定理)来计算它.

我试图使用FFTW实现这一点,但结果与预期结果不符.我之前从未使用过FFTW,现在我不确定如果我对卷积定理的假设是假的,那么我的实现是不正确的.

void f_I_NMDA_FFT(
    const double     **states, // states[i][6] == s_NMDA[i]
    const unsigned int numNeurons)
{
    fftw_complex *distances, *sNMDAs, *convolution;
    fftw_complex *distances_f, *sNMDAs_f, *convolution_f;
    fftw_plan     p, pinv;
    const double scale = 1./numNeurons;

        distances = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * numNeurons);
        sNMDAs    = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * numNeurons);
        convolution = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * numNeurons);
        distances_f = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * numNeurons);
        sNMDAs_f    = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * numNeurons);
        convolution_f    = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * …
Run Code Online (Sandbox Code Playgroud)

c++ math fft fftw biological-neural-network

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

MFCC在语音识别中的应用

我上周花了整整一个时间来搜索MFCC和相关问题.现在,我可以从二维矢量中的.wav文件中获得MFCC特征,coff [56] [12],让我们说.12是我想要提取的系数的数量,56是帧数.根据我读过的几个文件,我们可以使用12个以上的系数识别语音(特别是,我想识别单词"one","two"......到"ten").但是现在我得到了56个12个棺材,所以我应该使用56个框架中的哪一个?

如果我出错了,请帮帮我!

speech-recognition signal-processing fft voice-recognition mfcc

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

通过FFT执行2D卷积时的奇怪行为

我正在尝试构建2D盒函数的FFT和2D高斯函数的FFT的乘积.之后,我发现逆FFT,我期待这两个函数的卷积.但是,我得到了一个奇怪的片面结果,如下所示.结果显示在右下方subplot.

奇怪的结果

我写的重复上面的Octave代码subplot以及我为构造卷积而执行的计算如下所示.谁能告诉我我做错了什么?

clear all;
clc;
close all;
% domain on each side is 0-9
L = 10;
% num subdivisions
N = 32;
delta=L/N;
sigma = 0.5;
% get the domain ready
[x,y] = meshgrid((0:N-1)*delta);
% since domain ranges from 0-(N-1) on both sdes
% we need to take the average
xAvg = sum(x(1, :))/length(x(1,:));
yAvg =  sum(y(:, 1))/length(x(:,1));
% gaussian
gssn =  exp(- ((x - xAvg) .^ 2 + (y - yAvg) .^ 2) ./ …
Run Code Online (Sandbox Code Playgroud)

matlab signal-processing fft gaussian octave

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

使用cuda cuFFT从复数转换为实数时输出不正确

我使用cuda 7.5版cufft来执行一些FFT和逆FFT.使用cufftExecC2R(.,.)函数执行逆FFT时出现问题.

实际上,当我使用a batch_size = 1时,cufftPlan1d(,)我得到了正确的结果.但是,当我增加批量大小时,结果不正确.

我粘贴一个示例最小代码来说明这一点.我会快速创建它,请忽略代码的肮脏.

  #include <cufft.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <ctime>
#include <iostream>

typedef float2 Complex;

void iTest(int argc, char** argv);

#define SIGNAL_SIZE  9
#define BATCH_SIZE 2

int main(int argc, char** argv) {

    iTest(argc, argv);
    return 0;

}

void iProcess(Complex *x, double *y, size_t n) {

    cufftComplex *deviceData;
    cudaMalloc(reinterpret_cast<void**>(&deviceData),
               SIGNAL_SIZE * BATCH_SIZE * sizeof(cufftComplex));
    cudaMemcpy(deviceData, x, SIGNAL_SIZE * sizeof(cufftComplex) * BATCH_SIZE,
               cudaMemcpyHostToDevice);

    cufftResult cufftStatus;
    cufftHandle …
Run Code Online (Sandbox Code Playgroud)

c++ cuda fft cufft

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

对R中的时间序列进行傅立叶分析

我想使用R执行傅立叶变换到时间序列.我想:

  1. 得到5到18次谐波的总和
  2. 绘制每一波
  3. 并输出为csv文件.

这是数据的链接:数据 链接

这是我的初始代码.

dat   <- read.csv("Baguio.csv",header=FALSE)
y     <- dat$V1
ssp   <-spectrum(y)
t     <- 1:73
per   <- 1/ssp$freq[ssp$spec==max(ssp$spec)]
reslm <- lm(y ~ sin(2*pi/per*t)+cos(2*pi/per*t))
rg    <- diff(range(y))

#blue dashed line
plot(y~t,ylim=c(min(y)-0.1*rg,max(y)+0.1*rg))
lines(fitted(reslm)~t,col=4,lty=2)

#green line 2nd harmonics
reslm2 <- lm(y ~ sin(2*pi/per*t)+cos(2*pi/per*t)+sin(4*pi/per*t)+cos(4*pi/per*t))
lines(fitted(reslm2)~t,col=3)
Run Code Online (Sandbox Code Playgroud)

样本输出图像

有没有办法简化这段代码?如果我必须达到18次谐波,则等式变得非常长.另外,我仍然不知道如何在这里添加谐波.

提前谢谢了,

r fft

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

具有高精度数字的numpy.fft.fft的意外行为

我有以下代码...注意#generate sine curve下的两行.一个使用2pi的精度值高于另一个,它们仍然应该给出几乎相同的结果.

import numpy as np
import matplotlib.pyplot as plt


t1 = np.arange(0., 1., .01)

# generate sine curve
y1 = np.sin(6.28318*5.*t1)  
#y1 = np.sin(6.283185307179586*5.*t1) # equivalent to np.sin(2*np.pi*t1)

# calculate the fft (no averaging!) of the time series
ffty = np.fft.fft(y1)

fig, ax_list = plt.subplots(3,1)
ax_list[0].plot(t1,y1, '.-')

ax_list[1].plot(ffty.real, '.-', label='Real Part')
ax_list[1].legend()

ax_list[2].plot(ffty.imag, '.-', label='Imag Part')
ax_list[2].legend()


plt.show()
Run Code Online (Sandbox Code Playgroud)

如果运行精度较低的代码6.28318,则得到fft的预期结果... 在此输入图像描述

但是,如果你运行的代码具有更高的精度6.283185307179586,它等于2.*numpy.pi,你会得到以下意想不到的结果......实际部分是完全错误的...幅度偏离,它不是对称的,它没有任何意义. 在此输入图像描述

我不知道造成这种情况的原因.有人有主意吗?

python numpy fft

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

在Matlab中使用ifft2时为什么会移动图像

我正在使用FFT实现二维卷积。这是我的代码:

img = im2single(imread('dog.bmp'));
filter = fspecial('gaussian', 53, 3);
F = fft2(img);
mask = fft2(filter, size(img, 1), size(img, 2));
filtered_img = ifft2(F .* mask);
imshow(real(filtered_img));
Run Code Online (Sandbox Code Playgroud)

这是原始图像:

在此处输入图片说明

结果在这里: 在此处输入图片说明

为什么会这样?我该如何解决?请帮我。非常感谢。

matlab signal-processing fft image-processing convolution

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