- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以基本上我有一个函数可以计算给定大小为 N 的 vector 的复离散傅里叶级数。(所以我已经获得了 vector y 并且我必须找到 x)该代码使用 Daniel-Lanczo 的 FFT 算法,并且在 N=2^m 时完美运行。然而,当我用 N=3.2^m 或 N=5.2^m 之类的东西测试它时,我开始遇到问题。到目前为止我考虑过的最简单的是 N=6。
if((N%3)==0 && (N%2)==0 && (N%5)!=0)
是使 N=6 落入该特定 if 语句的条件。在此内部,我首先将 y 的元素分成 y (y_e) 的偶数条目,然后将 y (y_o) 的奇数条目分成并将它们加载到另一个大小为 2*N 的数组 w 中。一旦找到 x,我也会以类似的方式分离出 x_e 和 x_o,并将它们加载到 w 的不同部分。
该算法的工作原理是将 N 分成越来越小的分量,然后对它们进行傅立叶变换。例如,如果 N=4,则它将其分成 2 个大小为 2 的 vector (即 y_e 和 y_o),现在在其自身内部调用该函数两次,以获得大小 N=2,然后返回结果。然后将结果组合/累积以获得最终的傅立叶级数。
N=6 出现的问题是它把它分成了 2 个,所以我有 2 个大小为 3 的 vector y_e 和 y_o,所以当我现在从自身内部调用该函数时,大小为 3 而不是 6 ,它落入下面的第一个 if 语句(如果 N==3),并执行直接矩阵乘法来查找级数。请注意,我已在“If N==3”内将此 vector 称为“x”,它现在应该返回到我调用该函数的位置
FastDFS(x, y_e, w, Wp, (N/2), 1);
(其中 FastDFS 只是函数的名称)并再次打印结果“x”。但由于某种原因它未能这样做。它告诉我 x 的条目是 [0+0i,0+0i,0+0i],即它是空的。我不明白为什么会发生这种情况。我尝试创建一个新 vector ,在找到 N=3 的 x 后为其分配“x”条目,然后在 N=6 的情况下打印新 vector ,它可以工作..但它不切实际不起作用当我尝试更高的 N(例如 12 或 24)时。
有谁知道为什么它可能将 x 的条目设置为零?
我知道这很令人困惑,但如果有人可以提供帮助,我将非常感激!
if(N==3)
{
Cn=MakeCn(3);
x=complex_matrix_vector_multiply(Cn, y, 3, 3, 3, 1);
print_complex_vector(x, 3);
/*for(i=2*N;i<=3*N-1;i++)
{
for(j=0;j<=N-1;j++)
{
w[i]=x[j];
i++;
}
}*/
//printf("\ni am here thuis is w\n");
//print_complex_vector(w, 12);
}
if((N%3)==0 && (N%2)==0 && (N%5)!=0)
{
double complex *x_e,*x_o;
x_e=make_complex_vector(x_e, N/2);
x_o=make_complex_vector(x_o, N/2);
printf("whatup BBBB");
int j=0,k=0;
double complex *y_e,*y_o;
printf("\nthis is N: %d\n",N);
print_complex_vector(y, N);
y_e=make_complex_vector(y_e,N/2);
y_o=make_complex_vector(y_o,N/2);
/*********************************************************************************************************
Here were are going to separate the even and odd elements of y into the y_e and y_o.
*********************************************************************************************************/
for(i=0;i<=N-1;i++)
{
if(i%2==0)
{
y_e[j]=y[i];
j++;
}
else
{
y_o[k]=y[i];
k++;
}
}
printf("\n These are vectors y_e and y_o: \n");
print_complex_vector(y_e, N/2);
print_complex_vector(y_o, N/2);
/*********************************************************************************************************
Here were are going to load the even and odd elements of y into the w. w[0...N/2-1]=y_e and w[N/2...N-1]=y_o
*********************************************************************************************************/
for(k=0;k<=(N/2)-1;k++)
{
for(i=0;i<=(N-1);i++)
{
if(i%2==0)
{
w[k]=y[i];
k++;
}
}
}
for(j=N/2;j<=N-1;j++)
{
for(i=0;i<=(N-1);i++)
{
if(i%2!=0)
{
w[j]=y[i];
j++;
}
}
}
printf("\n This is the vector w: \n");
print_complex_vector(w, N);
/*********************************************************************************************************
Here were are going to call FastDFS twice within itself for N/2 with x, y_e, y_o and w.
The values of x that are found are the respective x_e and x_o that we load into w.
w[N...3N/2-1]=x_e and w[3N/2...2N-1]=x_o
*********************************************************************************************************/
Cn2=MakeCn(N/2);
FastDFS(x, y_e, w, Wp, (N/2), 1);
// printf("\n w in we ljkdgj\n");
// print_complex_vector(w, 2*N);
/* for(i=N;i<=(3*N/2)-1;i++)
{
for(j=0;j<=N-1;j++)
{
w[i]=x[j];
i++;
}
}*/
printf("\n here:\n");
print_complex_vector(x, N);
for(j=0;j<=(N/2)-1;j++)
{
for(i=N;i<=(3*N/2)-1;i++)
{
x_e[j]=w[i];
j++;
}
}
printf("\n this is x_e:\n");
print_complex_vector(x_e, N/2);
FastDFS(x, y_o, w, Wp, (N/2), 1);
// print_complex_vector(w, 2*N);
for(j=0;j<=(N/2)-1;j++)
{
for(i=N;i<=(3*N/2)-1;i++)
{
x_o[j]=w[i];
j++;
}
}
printf("\n this is x_o:\n");
print_complex_vector(x_o, N/2);
for(k=N;k<=(3*N/2)-1;k++)
{
for(j=0;j<=(N/2)-1;j++)
{
w[k]=x_e[j];
k++;
}
}
for(k=(3*N/2);k<=2*N-1;k++)
{
for(j=0;j<=(N/2)-1;j++)
{
w[k]=x_o[j];
k++;
}
}
print_complex_vector(w, 2*N);
/*********************************************************************************************************
Here were are going to find the final x_j and x_j+N/2 by x_j=[x_e]+W_n^j[x_o] and x_j+N/2+Wn^j+N/2[x_o]
This is the final answer for the Discrete Fourier Series of N even.
We do not use x_e and x_o explicitly but use different parts of w.
*********************************************************************************************************/
F=cos(2*pi/N)+I*sin(2*pi/N);
for(i=0;i<=(N/2)-1;i++)
{
for(j=N;j<=2*N-1;j++)
{
x[i]=w[j]+((cpow(F, i))*w[(j+N/2)]);
i++;
}
}
for(i=0;i<=(N/2)-1;i++)
{
for(k=N;k<=(2*N)-1;k++)
{
x[(i+N/2)]=w[k]+((cpow(F, (i+N/2)))*w[k+N/2]);
i++;
}
}
/*for(i=0;i<=(N/2)-1;i++)
{
x[i]=x_e[i]+((cpow(F, i))*x_o[i]);
x[(i+N/2)]=x_e[i]+((cpow(F, (i+N/2)))*x_o[i]);
}
*/
printf("\n\nThe Final Discrete Fourier Series, for N = %d, is:\n\n",N);
for (i=0; i<=N-1; i++)
{
printf ("%9.4f+%.4fi \n", creal(x[i]),cimag(x[i]));
}
}
最佳答案
线路
x=complex_matrix_vector_multiply(Cn, y, 3, 3, 3, 1);
将用计算结果覆盖x
的本地值。我假设 x 是一个指针,并且最初该指针指示您希望结果到达的位置。但在这一行之后,它指向其他位置,并且您最初传入的 x
将无法从函数内访问。
您可能想要使用某种形式的乘法,将其输出写入预先分配的数组。或者您想使用临时指针存储结果,然后一次从该结果复制到 x
一个元素。请记住之后释放
临时结果。
将函数头添加到您粘贴的代码片段中可能会使这些事情变得更加清晰,并且对于将来可能想要阅读它的人来说仍然会使问题更加清晰。
我没有仔细查看其余的实现,但是 Cn2=MakeCn(N/2);
行看起来是多余的。您没有使用该值,是吗?
关于c - FFT无法重新组合结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16268933/
FFT 库(例如 FFTW 或 numpy.fft)通常提供两个函数 fft() 和 ifft()(及其用于实值输入的特殊版本)。这些功能似乎被定义为 ifft(fft(X)) == X 和 fft(
如果我有一个特定大小 M(2 的幂)的 FFT 实现,我如何计算一组大小 P=k*M 的 FFT,其中 k 也是 2 的幂? #define M 256 #define P 1024 comple
下午好! 我正在尝试基于我已有的简单递归 FFT 实现来开发 NTT 算法。 考虑以下代码(coefficients'的长度,让它为m,是2的精确幂): /// /// Calculates the
我正在分析时间序列数据,并希望提取 5 个主要频率分量并将其用作训练机器学习模型的特征。我的数据集是 921 x 10080 。每行是一个时间序列,总共有 921 个。 在探索可能的方法时,我遇到了各
我找不到任何官方文档来证明 scipy.fft 实际上是 numpy.fft.fftpack.fft 的链接。这是显示链接的 iPython session : In [1]: import scip
文档说 np.fft.fft 这样做: Compute the one-dimensional discrete Fourier Transform. 和 np.fft.rfft 这样做: Compu
近一个月来,我一直在与一个非常奇怪的错误作斗争。问你们是我最后的希望。我用 C 编写了一个程序,它集成了 2d Cahn–Hilliard equation在傅里叶(或倒数)空间中使用隐式欧拉 (IE
我一直在制作一个例程,使用 NumPy/Scipy 测量两个光谱之间的相位差。 我已经有了Matlab写的例程,所以我基本上是用NumPy重新实现了函数和相应的单元测试。但是,我发现单元测试失败了,因
我正在研究使用 Renderscript 对大型复杂输入数组执行 FFT。 FFT 是相当标准的,因为它涉及三个循环,但内部循环执行 FFT 中的蝶形运算。因为每个蝴蝶使用数组的不同部分,所以没有明显
我需要通过修改 FFT 结果来均衡音乐样本。 我知道如何获得每个输出虚数的频率,问题是修改这个值以获得“均衡器效果”。 我需要知道如何缩放这个值。 条目大小为 4096 个样本,采样率为 44100
我将在 kiss-fft 之前制定几个计划同时(平行),我可以这样做吗,或者换句话说,kiss-fft 线程安全吗? 谢谢 最佳答案 自述文件: No static data is used. Th
要在频域中插入信号,可以在时域中填充零并执行 FFT。 假设给定向量 X 中的元素数为 N 并且 Y 与 X 相同但在一侧用 N 零填充。然后下面给出相同的结果。 $$\hat{x}(k)=\sum_
我通过相关了解了 DFT 的工作原理,并将其用作理解 FFT 结果的基础。如果我有一个以 44.1kHz 采样的离散信号,那么这意味着如果我要获取 1 秒的数据,我将有 44,100 个样本。为了对其
有人知道 Mayer FFT 的实现吗(我不必花很多时间研究代码)? 我正在尝试执行卷积,ifft 似乎产生了我称之为“镜像”的输出。换句话说,我的内核+信号长度被限制为 N/2 并且占据 n=0..
有人知道 Mayer FFT 的实现吗(我不必花很多时间研究代码)? 我正在尝试执行卷积,ifft 似乎产生了我称之为“镜像”的输出。换句话说,我的内核+信号长度被限制为 N/2 并且占据 n=0..
我有以下代码...请注意#生成正弦曲线下的两行。一个使用比另一个更高的 2pi 精度值,但它们仍然应该给出几乎相同的结果。 import numpy as np import matplotlib.p
我正在努力确保 FFTW 做我认为它应该做的事情,但我遇到了问题。我正在使用 OpenCV 的 cv::Mat。我制作了一个测试程序,给定一个 Mat f,计算 ifft(fft(f)) 并将结果与
我是从事电信项目的计算机程序员。 在我们的项目中,我必须将一系列复数更改为它们的傅立叶变换。因此我需要一个高效的 FFT 代码来满足 C89 标准。 我正在使用以下代码,它运行良好: shor
我目前正在尝试了解 numpy 的 fft 函数。为此,我测试了以下假设: 我有两个函数,f(x) = x^2 和 g(x) = f'(x) = 2*x。根据傅立叶变换定律和 wolfram alph
我一直在使用 FFT,目前正在尝试使用 FFT 从文件中获取声音波形(最终对其进行修改),然后将修改后的波形输出回文件。我得到了声波的 FFT,然后对其使用了反 FFT 函数,但输出文件听起来一点也不
我是一名优秀的程序员,十分优秀!