假设我有三个复杂波形(由许多正弦波组成):A,B和C.每个波形具有以下频率:分别为550,600,700 Hz.
现在我添加三个信号,即进行叠加以获得信号D.
我的目标是分别取回三个原始信号A,B和C.
我已经绘制了傅立叶光谱,在那里我获得了550,660和700 Hz的主峰.还有其他较小的山峰.我如何知道哪些波峰与哪些波形相关联,以便重新创建原始波形A,B和C?谢谢.
我有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)?
我使用0.025s长Hamming窗口和32768点FFT(?)来计算44100Hz采样音频信号的频谱,这是我的困惑:
所以我的问题是会发生什么?
从这个令人敬畏的解释我得出结论,32768点FFT通常意味着它意味着1秒间隔,并且确实Voicebox的rfft函数(我使用的)提到它截断/将样本填充到N.所以我假设它填充了我的小的1103向量,0到32768长向量,能够计算FFT.
嗯,这真的发生了吗?这可以改善分辨率,虽然只有信号的前1/32是非零的吗?(好吧,我想是的,但我想确定,因为这出现在论文辩护上 - 我现在就得到了这个想法,写这篇文章).
感谢您的任何反馈.
我正在尝试使用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) 我上周花了整整一个时间来搜索MFCC和相关问题.现在,我可以从二维矢量中的.wav文件中获得MFCC特征,coff [56] [12],让我们说.12是我想要提取的系数的数量,56是帧数.根据我读过的几个文件,我们可以使用12个以上的系数识别语音(特别是,我想识别单词"one","two"......到"ten").但是现在我得到了56个12个棺材,所以我应该使用56个框架中的哪一个?
如果我出错了,请帮帮我!
speech-recognition signal-processing fft voice-recognition mfcc
我正在尝试构建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) 我使用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) 我想使用R执行傅立叶变换到时间序列.我想:
这是数据的链接:数据 链接
这是我的初始代码.
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次谐波,则等式变得非常长.另外,我仍然不知道如何在这里添加谐波.
提前谢谢了,
我有以下代码...注意#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,你会得到以下意想不到的结果......实际部分是完全错误的...幅度偏离,它不是对称的,它没有任何意义.

我不知道造成这种情况的原因.有人有主意吗?
我正在使用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)
这是原始图像:
为什么会这样?我该如何解决?请帮我。非常感谢。