- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试使用亲吻 fft 将 fft 实现到 avr32 微 Controller 中以进行信号处理。
我的输出有一个奇怪的问题。
基本上,我将 ADC 样本(使用函数发生器测试)传递到 fft(实际输入,256 n 大小)中,并且检索到的输出对我来说很有意义。
但是,如果我将汉明窗口应用于 ADC 样本,然后将它们传递给 FFT,则峰值幅度的频率区间是错误的(并且与之前没有加窗的结果不同)。
ADC 样本具有 DC 偏移,因此我消除了偏移,但它仍然不适用于加窗样本。
下面是通过 rs485 的前几个输出值。
第一列是没有窗口的 fft 输出,而第二列是有窗口的输出。从第 1 列开始,峰值在第 6 行(6 x fs (10.5kHz)/0.5N)给了我正确的输入频率结果,其中第 2 列在第 2 行(dc bin 除外)有一个峰值幅度,这对我来说没有意义.
任何建议都会有所帮助。
提前致谢。
488 260 //dc bin 5 97 5 41 5 29 4 26 10 35 133 76 33 28 21 6 17 3
kiss_fft_scalar zero;
memset(&zero,0,sizeof(zero));
kiss_fft_cpx fft_input[n];
kiss_fft_cpx fft_output[n];
for(ctr=0; ctr<n; ctr++)
{
fft_input[ctr].r = zero;
fft_input[ctr].i = zero;
fft_output[ctr].r =zero;
fft_output[ctr].i = zero;
}
// IIR filter calculation
for (ctr=0; ctr<n; ctr++)
{
// filter calculation
y[ctr] = num_coef[0]*x[ctr];
y[ctr] += (num_coef[1]*x[ctr-1]) - (den_coef[1]*y[ctr-1]);
y[ctr] += (num_coef[2]*x[ctr-2]) - (den_coef[2]*y[ctr-2]);
//y1[ctr] += y[ctr] - 500;
// hamming window
hamming[ctr] = (0.54-((0.46) * cos(2*PI*ctr/256)));
window[ctr] = hamming[ctr]*y[ctr];
fft_input[ctr].r = window[ctr];
fft_input[ctr].i = 0;
fft_output[ctr].r = 0;
fft_output[ctr].i = 0;
}
kiss_fftr_cfg fftConfig = kiss_fftr_alloc(n,0,NULL,NULL);
kiss_fftr(fftConfig, (kiss_fft_scalar * )fft_input, fft_output);
for (ctr=0; ctr<n; ctr++)
{
fft_mag[ctr] = (sqrt((fft_output[ctr].r * fft_output[ctr].r) + (fft_output[ctr].i * fft_output[ctr].i)))/(0.5*n);
//Usart write
char filtResult[10];
sprintf(filtResult, "%04d %04d\n", (int)x[ctr], (int)fft_mag[ctr]);
//sprintf(filtResult, "%04d %04d\n", (int)x[ctr], (int)window[ctr]);
char c;
char *ptr = &filtResult[0];
do
{
c = *ptr;
ptr++;
usart_bw_write_char(&AVR32_USART2, (int)c);
// sendByte(c);
} while (c != '\n');
}
kiss_fft_cleanup();
free(fftConfig);
最佳答案
频域输出说明
在频域中,矩形窗和汉明窗如下所示:
您可能知道,时域中乘以一个窗口对应于频域中的卷积,它本质上将信号的能量分布在通常称为 spectral leakage 的多个频率区间上。 .对于您选择的特定窗口(在上面的频域中描述),您可能会注意到汉明窗口在主瓣外传播的能量要少得多,但该主瓣比矩形窗口的要宽一些。
因此,当使用汉明窗时,DC 能量的尖峰最终会扩散到 bin 0 并进入 bin 1。在 bin 1 中有一个强峰值并不是那么多。事实上,如果你绘制你提供的数据,你应该看到你在索引 6 看到的尖峰实际上仍然以相同的频率存在,并且不使用汉明窗:
如果您想消除周围 bin 中的 DC 尖峰和泄漏,请消除数据中的偏差(基本上应用陷波滤波器),或者在寻找“第一个强穗”。
过滤问题
最后,请注意,IIR 滤波器的实现方式也存在问题,即阵列 x
和 y
当 ctr==0
时将被索引越界和 ctr==1
(除非你做了一些特殊的规定,而且 x
和 y
实际上是从分配的缓冲区开始有一个偏移量的指针)。这可能会影响有窗口和没有窗口的结果。如果您只过滤单个数据块,一个常见的假设是早期样本为零。在这种情况下,您可以通过以下方式避免越界索引:
// filter calculation
y[ctr] = num_coef[0]*x[ctr];
if (ctr>=1)
{
y[ctr] += (num_coef[1]*x[ctr-1]) - (den_coef[1]*y[ctr-1]);
}
if (ctr>=2)
{
y[ctr] += (num_coef[2]*x[ctr-2]) - (den_coef[2]*y[ctr-2]);
}
n
的多个块样本,你必须记住上一个块的最后几个样本。这可以通过分配略大于块大小的缓冲区来完成:
x = malloc((n+2)*sizeof(kiss_fft_scalar));
y = malloc((n+2)*sizeof(kiss_fft_scalar));
// initialize "past samples" for the first block, assuming data was zero
x[0] = x[1] = 0;
y[0] = y[1] = 0;
// filter calculation
y[ctr+2] = num_coef[0]*x[ctr+2];
y[ctr+2] += (num_coef[1]*x[ctr+1]) - (den_coef[1]*y[ctr+1]);
y[ctr+2] += (num_coef[2]*x[ctr]) - (den_coef[2]*y[ctr]);
// hamming window
hamming[ctr] = (0.54-((0.46) * cos(2*PI*ctr/256)));
window[ctr] = hamming[ctr]*y[ctr+2];
// remember last 2 samples of block
x[0] = x[n-2];
x[1] = x[n-1];
y[0] = y[n-2];
y[1] = y[n-1];
关于signal-processing - 带或不带窗口的 KISS FFT 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30519032/
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我对傅立叶变换的有限理解是,您应该能够在不更改原始数据的情况下在时域和频域之间切换。所以,这里是我(认为我)正在做的事情的总结: 使用 kiss_fft_next_fast_size(994) 确定我
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我正在开发一个 C++ 项目,使用 FRDM-KL25Z 板来测量振动。我的代码正在运行,但我需要它循环运行。我的内存有问题,我没有足够的空间来存储两次值。我使用了 free() 命令,但即便如此我也
目录 封装变化 针对接口编程,不针对实现编程 多用组合(has-a),少用继承(is-a) 为交互对象之间的松耦合设计而努力 最少知识原则 LKP / 迪
前言 一个软件轻量简单的软件架构是非常重要的,它可以让我们花最小的代价就能满足业务上的需求。那如何保证轻量简单呢?那今天就和大家分享下这其中的秘密,也就是3个重要的指导原则,KISS原则,YAG
我目前正在尝试使用亲吻 fft 将 fft 实现到 avr32 微 Controller 中以进行信号处理。 我的输出有一个奇怪的问题。 基本上,我将 ADC 样本(使用函数发生器测试)传递到 fft
显然,YAGNI 和 KISS 之间存在语法差异,但我看不出它们之间有任何语义差异。它们本质上真的是一回事吗? 最佳答案 YAGNI(你不会需要它)指的是过度分析和实现可能需要也可能不需要的东西。当然
我正在尝试使用 visual studio 2013 让 kiss fft 在同一个应用程序中编译 float 和 double 实现。我看到我需要做的就是将 kiss_fft_scalar 设置为
什么是 KISS(Keep it Simple, Stupid)方法来记住 Boyce-Codd 范式是什么以及如何采用非规范化表和 BCNF? Wikipedia的信息:对我帮助不大。 最佳答案 C
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我从一年后开始工作,遵循 Scrum、TDD、领域驱动设计和 Uncle Bob 的食谱……但我对我们是否应用了各种原则有一些疑问,主要是在阅读 Martin 系列的“Java 应用程序架构”(从现在
我是 FFT 概念的初学者,所以我的理解是,如果我输入 1024 个信号,我将得到 513 个从 0hz 到 22050Hz 的 bin(在 44100Hz 采样率的情况下)。在 Cinder 中使用
我正在使用 couchDB 并开始实现身份验证/授权。我发现最好和最简单的解决方案是通过 ssl 连接传递凭据,但我不太确定这种策略是否能确保我的站点真正安全。 我可以保留这个策略,购买一个真正的 s
我在编译我的程序时遇到问题。我在我的项目中使用 Kiss FFT 库,但是当我尝试构建它时,我遇到了这些错误: [Linker Error] Error: Unresolved external '_
标题解释了我的问题。 我想做的很简单: 加载 MP3 轨道(通过 libmpg123) 阅读样本 对样本应用 Kiss FFT 到目前为止我尝试了什么 inline float scale(kiss_
我已经从 here 下载了 kiss fft | .但我不知道如何在 Visual Studio 中使用它。例如,在 Visual Studio 中创建一个空的 win32 项目后,我应该如何复制粘贴
如何将 kiss fft 库添加到 Visual Studio 2012 项目?因为我想编译这段代码: #include "kiss_fft.h" #include "kiss_fftr.h" kis
是否有基于 javascript 的配置应用程序框架的简单约定,其外观和感觉就像开箱即用的富客户端应用程序?例如,有是GWT ...但它很重(即它需要编译)。 更具体地说,考虑到像 JQuery 这样
我有两个模型: 服务器(属于从属) 从站(有许多服务器) 在 Controller 中,我需要获取一个包含服务器/从站信息的数组(以及一些附加信息,例如 Controller 中无法包含的业务逻辑)。
我是一名优秀的程序员,十分优秀!