我正在使用C++/C对某些数据执行前向和反向FFT,这些数据应该是激光器的脉冲输出.
我们的想法是获取输出,使用正向FFT转换到频域,对相位应用线性最佳拟合(首先展开它),然后从相位信息中减去这个最佳拟合.
然后将得到的相位和幅度转换回时域,最终目标是通过相位补偿压缩脉冲.
我试图在MATLAB中不成功地做到这一点,结果转而使用C++.前向FFT工作正常,我从C++中的数字配方中获取了基本配方,并使用函数对复杂输入进行修改,如下所示:
void fft(Complex* DataIn, Complex* DataOut, int fftSize, int InverseTransform, int fftShift)
{
double* Data = new double[2*fftSize+3];
Data[0] == 0.0;
for(int i=0; i<fftSize; i++)
{
Data[i*2+1] = real(DataIn[i]);
Data[i*2+2] = imag(DataIn[i]);
}
fft_basic(Data, fftSize, InverseTransform);
for(int i=0; i<fftSize; i++)
{
DataOut[i] = Complex(Data[2*i+1], Data[2*i+2]);
}
//Swap the fft halfes
if(fftShift==1)
{
Complex* temp = new Complex[fftSize];
for(int i=0; i<fftSize/2; i++)
{
temp[i+fftSize/2] = DataOut[i];
}
for(int i=fftSize/2; i<fftSize; i++)
{
temp[i-fftSize/2] = DataOut[i];
}
for(int i=0; …
Run Code Online (Sandbox Code Playgroud) 我知道我可以通过改变变量的整数改变频率偏移,但我怎样才能改变频率使用数字与小数像0.754或1.2345或67.456.如果我将变量'shift'更改为像5.1 这样的非整数,我得到一个错误,下标索引必须是小于2 ^ 31的正整数或来自行mag2s的逻辑= [mag2(shift + 1:end),0 (1,移位)];
示例下面的问题代码在matlab/octave中使用fft和ifft增加/减少信号的频率 与改变变量一起工作(但它只适用于整数,我需要它也可以使用小数数字).
PS:我正在使用octave 3.8.1,就像matlab一样,我知道我可以通过调整变量ya中的公式来改变频率,但是ya将是从音频源(人类语音)中获取的信号,所以它不会是一个等式.该等式仅用于保持示例简单.是的Fs很大,因为使用的信号文件长约45秒,这就是为什么我不能使用重新采样,因为我在使用时出现内存不足错误.
这是一个动画的youtube视频示例,当我使用测试方程ya = .5*sin(2*pi*1*t)+.2*cos(2*pi*3*t)时,我想要得到的内容我想要让发生,如果我改变的变量转变,从(0:0.1:5)youtu.be/pf25Gw6iS1U请记住,雅将导入音频信号,所以我不会有一个公式可以轻松地调整
clear all,clf
Fs = 2000000;% Sampling frequency
t=linspace(0,1,Fs);
%1a create signal
ya = .5*sin(2*pi*2*t);
%2a create frequency domain
ya_fft = fft(ya);
mag = abs(ya_fft);
phase = unwrap(angle(ya_fft));
ya_newifft=ifft(mag.*exp(i*phase));
% ----- changes start here ----- %
shift …
Run Code Online (Sandbox Code Playgroud) 我想使用fft
exp 乘以(-j*2*pi*x*F)来移动图像(由2D矩阵表示),其中x是位移.我有:
input=peaks(200);
H=fftshift(fft2(fftshift(input)));
x=19;
H=H*exp(-1i*x*2*pi*F);
IF_image=fftshift(ifft2(fftshift(H)));
imshow(IF_image)
Run Code Online (Sandbox Code Playgroud)
但是由于我的输入是一个二维数组,我在识别/表示H [F]中的F时遇到了麻烦.我怎么能这样做?所需的输出将是我的原始图像在同一帧中在水平轴上移位(x个单位),因此它将从x + 1开始.举个例子:
如果 input=
1 2 3 4 5
6 7 8 9 0
Run Code Online (Sandbox Code Playgroud)
和x = 2,我想要:
4 5 1 2 3
9 0 6 7 8
Run Code Online (Sandbox Code Playgroud) 我有一个ordinary differential equation
及时的域名如下:
C*du/dt = -g*u + I
Run Code Online (Sandbox Code Playgroud)
哪里 I = A*t/tau*exp^(1-t/tau)
在freq域中:
u(w) = I(w)/(g*(1+C/g*j*w))
Run Code Online (Sandbox Code Playgroud)
j
是一个复杂的数字 sqrt(-1)
因此,我可以u(t)
通过快速傅里叶变换(fft
)进入频域 ,然后再使用ifft
.
代码:
t = np.linspace(0.,499.9,5000)
I = q*t*np.exp(1-t/Tau_ca)/Tau_ca
u1 = np.fft.ifft(np.fft.fft(I)/(G_l*(1.+1.j*(C_m/G_l)*np.fft.fftfreq(t.shape[-1]))))
Run Code Online (Sandbox Code Playgroud)
然而,当我将其u(t)
与其他方法(如微分方程的数值积分或其分析形式)进行比较时,这是不正确的.我已经尝试过并且未能成功找出我的错误所在.
请指教.
我正在尝试使用快速傅立叶变换(fft)实现快速多项式除法.
这是我到目前为止所得到的:
from numpy.fft import fft, ifft
def fft_div(C1, C2):
# fft expects right-most for significant coefficients
C1 = C1[::-1]
C2 = C2[::-1]
d = len(C1)+len(C2)-1
c1 = fft(list(C1) + [0] * (d-len(C1)))
c2 = fft(list(C2) + [0] * (d-len(C2)))
res = list(ifft(c1-c2)[:d].real)
# Reorder back to left-most and round to integer
return [int(round(x)) for x in res[::-1]]
Run Code Online (Sandbox Code Playgroud)
这适用于相同长度的多项式,但如果长度不同则结果是错误的(我对RosettaCode的 extended_synthetic_division()
函数进行基准测试):
# Most signficant coefficient is left
N = [1, -11, 0, -22, 1]
D = [1, -3, 0, …
Run Code Online (Sandbox Code Playgroud) 我是否只是嵌套他们(iff(fft(audio))
)或逐个窗口(window
音频,做fft
,做ifft
,然后反转窗口,用eps替换零,然后合并样本(abs
在管道中尝试这里和那里))我只得到噪音.
我知道这ifft
只是fft
与无限精度算术,无限多个样本等相反(对吗?)我正在使用64位浮点和44kHZ采样率.但是,我希望能够至少听到原始音频.
我的错误是实践还是理论?我可以给代码,如果它是一个错误.
如果我有波形x
如
x = [math.sin(W*t + Ph) for t in range(16)]
Run Code Online (Sandbox Code Playgroud)
任意W
和Ph
,和我计算其(真实)FFT f
与
f = numpy.fft.rfft(x)
Run Code Online (Sandbox Code Playgroud)
我可以得到原来x
用
numpy.fft.irfft(f)
Run Code Online (Sandbox Code Playgroud)
现在,如果我需要将恢复波形的范围扩展到左侧和右侧的多个样本,该怎么办?即波形y
这样len(y) == 48
,y[16:32] == x
和y[0:16], y[32:48]
是原始波形的周期延长.
换句话说,如果FFT假设其输入是f(t)
采样的无限函数t = 0, 1, ... N-1
,我该如何恢复f(t)
for t<0
和t>=N
?的值.
注意:我使用完美的正弦波作为示例,但实际上x
可以是任何东西:任意信号,如x = range(16)
或x = np.random.rand(16)
,或从随机.wav
文件中取出的任何长度的段.
我在matlab中使用2D高斯函数创建了一个图像,我也在matlab中定义了这个图像,现在我试图对结果矩阵进行去卷积,看看是否使用fft2和ifft2命令得到了2D高斯函数.但是我得到的矩阵不正确(据我所知).这是我到目前为止所做的代码:
%code for input image(img)[300x300 array]
N = 100;
t = linspace(0,2*pi,50);
r = (N-10)/2;
circle = poly2mask(r*cos(t)+N/2+0.5, r*sin(t)+N/2+0.5,N,N);
img = repmat(circle,3,3);
Run Code Online (Sandbox Code Playgroud)
二维高斯函数的%代码,c = 0 sig = 1/64(Z)[300x300数组]
x = linspace(-3,3,300);
y = x';
[X Y] = meshgrid(x,y);
Z = exp(-((X.^2)+(Y.^2))/(2*1/64));
Run Code Online (Sandbox Code Playgroud)
使用Z(C)[599x599数组]进行img二维卷积的%代码
C = conv2(img,Z);
Run Code Online (Sandbox Code Playgroud)
%我已经使用img和C的横截面轮廓矢量测试了这个卷积是正确的,得到的xy图是我对卷积的期望.
根据我对卷积的了解,该算法在傅里叶空间中作为乘法器,因此通过我的输入(img)除以输出的傅立叶变换(旋转图像),我应该得到点扩散函数(Z - 2D高斯函数) )通过除法将逆傅立叶变换应用于该结果之后.
尝试2D反卷积的%代码
Fimg = fft2(img,599,599);
Run Code Online (Sandbox Code Playgroud)
添加%零填充以将结果增加到599x599阵列
FC = fft2(C);
R = FC/Fimg;
Run Code Online (Sandbox Code Playgroud)
%我现在得到这个错误提示:警告:矩阵接近单数或严重缩放.结果可能不准确.RCOND = 2.551432e-22
iFR = ifft2(R);
Run Code Online (Sandbox Code Playgroud)
我期待iFR接近Z,但我得到了完全不同的东西.它可能是具有复杂值的Z的近似值,但我似乎无法检查它,因为我不知道如何在matlab中绘制3D复杂矩阵.所以,如果有人能告诉我我的答案是正确还是不正确以及如何让这种去卷积起作用?我将不胜感激.
我试图实现分步傅立叶方法来解决光学中的非线性薛定谔方程.它主要分别处理线性部分和非线性部分.它通过傅里叶变换和时域中的非线性部分来求解线性部分.
从书中复制以下代码:
alpha = 0
beta_2 = 1
gamma = 1
T = linspace(-5,5,2^13);
delta_T = T(2)-T(1);
L = max(size(A));
delta_omega = 1/L/delta_T*2*pi;
omega = (-L/2:1:L/2-1)*delta_omega;
A = 2*sech(T);
A_t = A;
step_num = 1000;
h = 0.5*pi/step_num;
results = zeros(L,step_num);
A_f = fftshift(fft(A_t));
for n=1:step_num
A_f = A_f.*exp(-alpha*(h/2)-1i*beta_2/2*omega.^2*(h/2));
A_t = ifft(A_f);
A_t = A_t.*exp(1i*gamma*(abs(A_t).^2*h));
A_f = fft(A_t);
A_f = A_f.*exp(-alpha*(h/2)-1i*beta_2/2*omega.^2*(h/2));
A_t = ifft(A_f);
results(:,n) = abs(A_t);
end
Run Code Online (Sandbox Code Playgroud)
A_t
脉冲在哪里(要解决的功能).我不明白的是,它最初用于fftshift
将零频率移动到中心,但后来又在循环中没有fftshift
.我尝试添加fftshift
到主循环,或在最开始删除它.两者都给出了错误的结果,为什么呢?在一般情况下,我应该什么时候使用fftshift
和 …
我试图用fft过滤一些信号。我正在处理的信号非常复杂,我对这个主题没有真正的经验。这就是为什么我创建了一个简单的 3Hz 正弦波并试图切断 3Hz。
到目前为止,很好
import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fftfreq, irfft, rfft
t = np.linspace(0, 2*np.pi, 1000, endpoint=True)
f = 3.0 # Frequency in Hz
A = 100.0 # Amplitude in Unit
s = A * np.sin(2*np.pi*f*t) # Signal
dt = t[1] - t[0] # Sample Time
W = fftfreq(s.size, d=dt)
f_signal = rfft(s)
cut_f_signal = f_signal.copy()
cut_f_signal[(np.abs(W)>3)] = 0 # cut signal above 3Hz
cs = irfft(cut_f_signal)
fig = plt.figure(figsize=(10,5))
plt.plot(s)
plt.plot(cs) …
Run Code Online (Sandbox Code Playgroud)