硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5655|回复: 12
收起左侧

[DSP] FFT补零计算的前后效果

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106534
QQ
发表于 2020-5-18 14:47:20 | 显示全部楼层 |阅读模式
有时候我们采集的数据不够256,512,1024等数据,就可以通过补零来解决,比如下面是采集了200个点,通过补零到512个点



  1. fs=200;                            % 采样频率
  2. N=200;                             % 信号长度
  3. n=1:N;                             % 样点索引
  4. t=(n-1)/fs;                        % 时间刻度
  5. x=cos(2*pi*30*t)+cos(2*pi*65.5*t); % 信号

  6. X1=fft(x, N);                    % 按N点进行FFT
  7. freq1=(0:N/2)*fs/N;                % N点时正频率刻度
  8. X1_abs=abs(X1(1:N/2+1))*2/N;       % 信号幅值

  9. L=512;
  10. X2=fft(x,L);                     % 按L长进行FFT
  11. freq2=(0:L/2)*fs/L;                % L点时频率刻度
  12. X2_abs=abs(X2(1:L/2+1))*2/N;       % 信号幅值

  13. subplot 211;
  14. plot(freq1,X1_abs);
  15. grid;
  16. ylim([0 1.2]);
  17. xlabel('频率/Hz');
  18. ylabel('幅值');
  19. title('(a) 补零前FFT谱图')

  20. subplot 212;
  21. plot(freq2,X2_abs);
  22. grid;
  23. ylim([0 1.2]);
  24. xlabel('频率/Hz');
  25. ylabel('幅值');
  26. title('(b) 补零后FFT谱图')
复制代码


效果

QQ截图20200518161557.png




回复

使用道具 举报

19

主题

31

回帖

88

积分

初级会员

积分
88
发表于 2020-6-5 14:59:32 | 显示全部楼层
这个能无限提高分辨率么
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106534
QQ
 楼主| 发表于 2020-6-5 15:00:31 | 显示全部楼层
卡卡倬 发表于 2020-6-5 14:59
这个能无限提高分辨率么

不能
回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
发表于 2020-8-18 13:21:01 | 显示全部楼层
想问下,波形采样后,能在进行分频吗?也就是原有数据上做降低采样率处理,而不用通过降低ADC采样率实现。
我的目的是,FFT点数不变情况下提高中低频信号的分辨率。比如32khz做256点变换是125hz分辨率,对中低频音频信号来说太低,所以想降低采样率。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106534
QQ
 楼主| 发表于 2020-8-18 13:47:21 | 显示全部楼层
飛饵 发表于 2020-8-18 13:21
想问下,波形采样后,能在进行分频吗?也就是原有数据上做降低采样率处理,而不用通过降低ADC采样率实现。
...

貌似无法实现这种骚操作。

回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
发表于 2020-8-18 13:54:01 | 显示全部楼层
eric2013 发表于 2020-8-18 13:47
貌似无法实现这种骚操作。

哈哈,网上找到个8分频的的算法,好像是用若干个已采样点数据相加取平均,算了下采样时间间隔是变大了,但不知道这样的做法合不合理。
  1. /**
  2.      * 显示频谱时进行FFT计算
  3.      *
  4.      * @param buf
  5.      * @param samplerate 采样率
  6.      */
  7.     public void spectrogram(int[] buf, double samplerate) {
  8.         first_fft_real[0] = buf[0];
  9.         first_fft_imag[0] = 0;

  10.         second_fft_real[0] = buf[0];
  11.         second_fft_imag[0] = 0;

  12.         for (int i = 0; i < FFT_SIZE; i++) {
  13.             first_fft_real[i] = buf[i];
  14.             first_fft_imag[i] = 0;
  15.             // 八分频(相当于降低了8倍采样率),这样1024缓存区中的fft频率密度就越大,有利于取低频
  16.             second_fft_real[i] = (buf[i * 8] + buf[i * 8 + 1] + buf[i * 8 + 2]
  17.                     + buf[i * 8 + 3] + buf[i * 8 + 4] + buf[i * 8 + 5]
  18.                     + buf[i * 8 + 6] + buf[i * 8 + 7]) / 8.0;
  19.             second_fft_imag[i] = 0;
  20.         }
  21.         // 高频部分从原始数据取
  22.         fft(first_fft_real, first_fft_imag, FFT_SIZE);

  23.         // 八分频后的1024个数据的FFT,频率间隔为5.512Hz(samplerate / 8),取低频部分
  24.         fft(second_fft_real, second_fft_imag, FFT_SIZE);
  25.         //这里算出的是每一个频点的坐标,对应横坐标的值,因为是定值,所以只需要算一次
  26.         if (loc == null) {
  27.             loc = new int[SPECTROGRAM_COUNT];
  28.             sampleratePoint = new double[SPECTROGRAM_COUNT];
  29.             for (int i = 0; i < loc.length; i++) {
  30.                 //20000表示的最大频点20KHZ,这里的20-20K之间坐标的数据成对数关系,这是音频标准
  31.                 double F = Math.pow(20000 / 20, 1.0 / SPECTROGRAM_COUNT);//方法中20为低频起点20HZ,31为段数
  32.                 sampleratePoint[i] = 20 * Math.pow(F, i);//乘方,30为低频起点
  33.                 //这里的samplerate为采样率(samplerate / (1024 * 8))是8分频后点FFT的点密度
  34.                 loc[i] = (int) (sampleratePoint[i] / (samplerate / (1024 * 8)));//估算出每一个频点的位置
  35.             }
  36.         }
  37.         //低频部分
  38.         for (int j = 0; j < LowFreqDividing; j++) {
  39.             int k = loc[j];
  40.             // 低频部分:八分频的数据,取31段,以第14段为分界点,小于为低频部分,大于为高频部分
  41.             // 这里的14是需要取数后分析确定的,确保低频有足够的数可取
  42.             real[j] = second_fft_real[k]; //这里的real和imag对应fft运算的实部和虚部
  43.             imag[j] = second_fft_imag[k];
  44.         }
  45.         // 高频部分,高频部分不需要分频
  46.         for (int m = LowFreqDividing; m < loc.length; m++) {
  47.             int k = loc[m];
  48.             real[m] = first_fft_real[k / 8];
  49.             imag[m] = first_fft_imag[k / 8];
  50.         }
  51.     }
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106534
QQ
 楼主| 发表于 2020-8-18 14:16:57 | 显示全部楼层
飛饵 发表于 2020-8-18 13:54
哈哈,网上找到个8分频的的算法,好像是用若干个已采样点数据相加取平均,算了下采样时间间隔是变大了, ...

可以,刚刚想到过采样了,没有想通这个逻辑关系。

比如现在主频是32KHz,采集32K个点,1秒1次,如果实现8分频的话,即4KHz采样,也要采集32K个点,就只能提升采样时间,8秒一次。

而你要求采样不变,那就只能过采样,32KHz频率的情况下,采样8秒,求平均,即8倍过采样 ====>等效于 4KHz采样,1秒采集32K个点。

回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
发表于 2020-8-18 16:41:56 | 显示全部楼层
eric2013 发表于 2020-8-18 14:16
可以,刚刚想到过采样了,没有想通这个逻辑关系。

比如现在主频是32KHz,采集32K个点,1秒1次,如果实 ...

这算法好像和你说的不太一样?他貌似是一次就完采1024个点,然后就取平均了,这样也能达到效果吗?

还有以前你有个帖子说没总结出对数横坐标的公式,这算法里也做了,您研究研究?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106534
QQ
 楼主| 发表于 2020-8-18 16:49:16 | 显示全部楼层
飛饵 发表于 2020-8-18 16:41
这算法好像和你说的不太一样?他貌似是一次就完采1024个点,然后就取平均了,这样也能达到效果吗?

还 ...

他这个我没有看程序,我楼上的回复是没问题的。

另外你说的取对数,我专门发过一个帖子

【原创】2017年第一天,说说音乐频谱的那些事,主流的音频软件一般都是采用对数谱。
http://www.armbbs.cn/forum.php?m ... 5129&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
发表于 2020-8-18 17:03:05 | 显示全部楼层
eric2013 发表于 2020-8-18 16:49
他这个我没有看程序,我楼上的回复是没问题的。

另外你说的取对数,我专门发过一个帖子

好吧,有空试下效果。
还有那个帖子我也在底下讨论过。纵坐标轴我也做对数化了,效果很好。
只是,横坐标一直不知道怎么对数化
回复

使用道具 举报

36

主题

142

回帖

250

积分

高级会员

积分
250
发表于 2020-8-26 14:09:29 | 显示全部楼层
可以利用先滤波,然后在降低采样率提高分辨率,可以在32k采样率获得的数据每个N个抽一个采样率就变成了32/N了
回复

使用道具 举报

2

主题

39

回帖

45

积分

新手上路

积分
45
发表于 2021-9-27 10:50:37 | 显示全部楼层
补零补超过多少就没效果了呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106534
QQ
 楼主| 发表于 2021-9-27 10:52:27 | 显示全部楼层
落叶凋零 发表于 2021-9-27 10:50
补零补超过多少就没效果了呢?

这个要实测下,一般稍补点,问题不大。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-24 00:27 , Processed in 0.201775 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表