到目前为止,我已经完全在空间域中实现了高斯模糊滤波器,利用了高斯的可分离性,即沿着行应用1D高斯核,然后沿着图像的列应用.这工作得很好.
现在,仅给出空间域的NxN卷积矩阵的大小N,我想在频域上实现完全相同的模糊图像.这意味着我将图像加载到矩阵中(numpy,我正在使用python),对它应用FFT(然后我有G(x,y)),然后我还必须有一个滤波器H( u,v)在频域中,它也类似于某些2d高斯的形状,其中心值为1.0,然后值越来越偏离0离我的中心越远.然后我在频域中进行乘法(在我必须考虑进行H的中心偏移之前)然后应用iFFT.
我遇到的麻烦是找到导致相应H(u,v)的确切公式(即找到sigma,std-deviation).从空间域,如果给我一个掩码大小N,我知道std-dev西格玛可以近似为sigma =(maskSize-1)/2/2.575,例如对于掩码大小N = 15我得到对于e ^ - (x²/2sigma²),std-dev = 2.71845,现在只考虑1D情况.
但是如何获得频域的sigma?
有趣的是顺便说一句,理论上我知道如何使用Mathematica获得sigma,但结果是纯粹的假,我可以在这里证明:
gauss1d[x_, sigma_] := Exp[-(x^2)/(2 sigma^2)]
Simplify[FourierTransform[gauss1d[x, sigma], x, omega], sigma > 0]
Run Code Online (Sandbox Code Playgroud)
结果是E ^( - (1/2)omega ^ 2 sigma ^ 2)*sigma
这是假的,因为它在E函数的指数中将1 /sigma²转换为sigma².因此,如果你画出这个,你就会发现标准偏差变小了很多,因为H(u,v) - 高斯很多"更薄".但是,它实际上应该在频域中比在空间域中宽得多!它没有任何意义......
我可以使用fft来获取加载的1秒音频文件的人,说"ahhhh"并重新创建它,频率,相位和幅度.我现在要做的是找出每个频率开始的位置以及它们在1秒音频文件中的结束位置并将数据放入数组中
示例:100hz从.23seconds开始到.34seconds,104.34hz从.35seconds开始,到.37seconds结束.
fft可以做到这一点还是我需要将整个程序转移到使用小波?还有八度音阶中的小波示例,说明如何做我想要完成的事情吗?
我正在使用来自repo的Ubuntu Linux 12.04和Octave 3.2.4
谢谢里克
我有和音频信号,我用Matlab读,并使用pwelch获取其PSD,这里是我正在使用的代码
[x,Fs] = audioread('audioFile.wav');
x= x(:,1) % mono
[xPSD,f] = pwelch(x,hamming(512),16,1024,Fs);
plot(f,xPSD);
Run Code Online (Sandbox Code Playgroud)
因为FS=96000我只对5赫兹的频率感兴趣,我想仅为该区域计算PSD,并且还能够调整PSD的分辨率!任何想法要做到这一点!
我有一个简单的问题,但由于我没有使用MATLAB傅立叶变换工具,我需要一些帮助.我有一个从n excel文件获得的情节.该图是时域.绘图的时间范围是0到50 ps.我每0.5秒有一个y分量的数据.基本上,该图包含每0.5fs打印的100000个数据.现在我想得到这个情节的傅里叶变换.我该怎么办?以下是我的excel文件的简单格式,其中包含我需要具有时域图的数据.
0 116.0080214
0.0005 116.051128
0.001 116.0939229
0.0015 116.1362197
0.002 116.1776665
0.0025 116.2178118
0.003 116.256182
.
.
.
.
50.0 123.000
Run Code Online (Sandbox Code Playgroud)
第一列是ps的时间.非常感谢你提前帮助.最好,HRJ
我想用Python3计算功率谱.从另一个关于这个主题的主题我得到了基本的成分.我认为应该是这样的:
ps = np.abs(np.fft.fft(x))**2
timeres = t[1]-t[0]
freqs = np.fft.fftfreq(x.size, timeres)
idx = np.argsort(freqs)
plt.plot(freqs[idx], ps[idx])
plt.show()
Run Code Online (Sandbox Code Playgroud)
这t是时间,x是光子计数.我也尝试过:
W = fftfreq(x.size, timeres=t[1]-t[0])
f_x = rfft(x)
plt.plot(W,f_x)
plt.show()
Run Code Online (Sandbox Code Playgroud)
但两者大多只是给我一个零左右的峰值(尽管它们不一样).我试图从这个计算功率谱:
哪个应该给我一个大约580Hz的信号.我在这做错了什么?
我有一个随时间变化的信号(a),我将其作为参考。我需要将频率相关的加权因子乘以fft的y轴值;但是,如果我这样做:
xdft = fft(a);
xdft = xdft(1:length(x)/2+1); % only retaining the positive frequencies
freq = Fs*(0:(L/2))/L;
Run Code Online (Sandbox Code Playgroud)
然后plot(freq,xdft)在正确的信号频率下获得〜2000的峰值fft值(y轴)。但是原始信号的峰值(幅度)约为46。我需要知道数字之间的关系,以便可以对fft值进行加权。
我正在尝试对某些数据(高斯脉冲)进行FFT,但我发现了一个奇怪的结果.结果FFT的实部和虚部在符号阵列的每个索引中交替出现.然而,阵列的绝对值是连续的.所以,我得到的东西看起来像这样:

有没有人知道造成这种情况的原因?谢谢!
我将FFT应用于每个图像.我提取了图像1和2的角度或相位.之后,我想交换两个图像之间的相位响应,但保持大小完整.我到目前为止的代码是:
Image1=double(imread('/home/anelmad/Desktop/ml/signal_images_processing/tp6/barbara.png'))/255;
Image2=double(imread('/home/anelmad/Desktop/ml/signal_images_processing/tp6/lena.bmp'))/255;
Image1=fft2(Image1);
Image2=fft2(Image2);
figure(1);
imshow(angle(Image1));
x=(angle(Image1));
angle(Image2)=x;
figure(2);
imshow(Image2);
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
error: assignment failed, or no method for '<unknown type> = matrix'
Run Code Online (Sandbox Code Playgroud)
我认为问题是我们应该修改傅里叶变换矩阵(fft2)中的复数.那是对的吗?
从我对fft函数的理解(例如,从类似这样的问题开始)
假设1D fft,给定N点实际数据,对于零频率,我将得到长度为N(但为复数)+1的双面fft。如果我采用相同的fft输出,并对其执行ifft,则将获得N个实数值,在理想情况下,这将与fft的原始输入完全匹配。
在cufft中,这似乎有很大不同。
根据Nvidia的研究,给N个实数分量将导致fft的N2 +1个复杂分量,而N2 + 1个复杂分量将导致N个实数分量。
看到这里(R =实数,C =复数,2 =到):
请注意,我认识到一半的复杂成分实际上是重复的(但共轭并颠倒了),因此对于输入输出值保留重建所需的所有日期而言并不是必需的,但这并不能解释Nvidia如何声称fft的输入和输出数据长度应该结构化,cufft的输入和输出长度所做的事情与我对此情况的预期相反。