文档章节

图像处理技术第五次实验

天蚕宝衣
 天蚕宝衣
发布于 2017/04/19 15:42
字数 1244
阅读 13
收藏 0

一. 实验目的

掌握快速傅里叶变换。

二. 实验内容

通过Matlab软件,实现8个点的快速傅里叶变换,将时域信号上的8个点,转换成相应的频域信号上的8个点。

三. 实验步骤

1.      编写fft0.m文件。

 

%%

% 设定采样频率,每秒采集100个点。

fs = 100;

% 总共采样8个点。

N = 8;

n = 0 : N - 1;

% t是一个数组,数组长度是8,数组的下标是1-8。

% t中存储的是第1个点到第8个点的采样时刻。

t = n / fs;

%{

仿真原始信号。

设定正弦信号的频率。

设定仿真原始信号的频率为10Hz。

%}

f0 = 10;

% x是一个数组,数组长度是8,数组的下标是1-8。

% 数组中存储的值是8个信号相应的幅度。

x = sin(2 * pi * f0 * t); % 生成正弦信号。

figure(1);

subplot(131);

plot(t, x);               % 做正弦信号的时域波形。

xlabel('t');

ylabel('y');

title('正弦信号y=2*pi*f0*10t的时域波形');

% 画网格。

grid;

% 原始信号绘制完毕。

 

% 进行FFT变换并做频谱图。

% y = fft(x, N);%进行fft变换

%{

将x数组中存储的采样的信号中的8个点相应的幅值传进selfFFT函数。

返回的是矩阵F的最后一列。

y是一个列向量,存放的都是复数。

%}

y = selfFFT(x); % 进行fft变换。

mag = abs(y);                             % 求幅值

f = (0 : length(y) - 1)' * fs / length(y);% 进行对应的频率转换

figure(1);

subplot(132);

plot(f, mag);% 做频谱图

axis([0, 100, 0, 80]);

xlabel('频率(Hz)');

ylabel('幅值');

title('正弦信号y=2*pi*10t幅频谱图N=8');

grid;

 

2.      编写selfFFT.m文件。

function FN = selfFFT(x)

    % 数组x的长度,即N的值,即对信号进行采样的点的个数。

    L = length(x);

    % 此时L=N。

    % ceil函数取离它最近的且大于它的整数。

    %{

    因为若要对信号进行FFT,则采样点的个数必须是2的整数次幂,

    所以此处要对采样点的个数进行处理。

    得到的N值就为处理后的采样点的个数。

    %}

    r = ceil(log2(L));

    N = 2^(r);

   

    % 若采样点的个数大于x数组中存储的值的个数,则对数组x中剩余的幅值补0。

    x = [x ; zeros(N - L : 1)];

    % 返回的X是一个填充后的矩阵,填充的值是实数。

    X = fftMatrix(N);

    % 生成一个8行,4列的全0矩阵。

    F = zeros(N, r + 1);

    %{

    一列一列地填充这个矩阵。

    数组x中存储的都是采样点的幅值。

    只填充F矩阵的第一列。

    %}

    for j = 1 : N

        F(j, 1) = x(X(j, r));

    end

    % w是信号中的采样点转换到频域后对应的纵坐标。

    w = wj(N);

    % 填充F矩阵。

    for f = 2 : r + 1

        G = 2^(r - f + 1);

        J = 2^(f - 1);

        for g = 1 : G

            for j = 1 : J / 2

                % 填复数的实部。

                % 从F矩阵的第一行第二列开始。

                F(j + J * (g - 1), f) = F(j + J * (g - 1), f - 1) + w(G * (j - 1) + 1) * F(j + 2^(f - 2) + J * (g - 1), f - 1);

            end

            for j = (J / 2 + 1) : J

                F(j + J * (g - 1), f) = F(j - J / 2 + J * (g - 1), f - 1) + w(G * (j - 1) + 1) * F(j - J / 2 + 2^(f - 2) + J * (g - 1), f - 1);

            end

        end

    end

   

    % 将F矩阵的第r+1列填充到FN,所以FN是一个列向量。

    FN = F(:, r + 1);

end

function X = fftMatrix(N)

    % r: 采样点的个数是2的N次幂。

    r = log2(N);

    % X为N行r列的矩阵,矩阵中的值全部填0。

    X = zeros(N, r);

    % X(:, 1)表示X的第一列所有元素所组成的一个列向量。

    X(:, 1) = 1 : N;

    % 填充X矩阵的第2到r列的值。

    for f = 2 : r

        % 分组

        G = 2^(f - 1);

        for g = 1 : G

            % 个体

            J = 2^(r - f + 1);

            % 填充某一列的第j个值。

            for j = 1 : J

                %{

                mod(x, y): 求模;

                mod(x, y) = x - y. * floor(x. / y); (floor()向左取整)

                %}

                X(j + J * (g - 1), f) = X(2 * j - mod(g, 2) + J * 2 * (floor((g - 1) / 2)), f - 1);

           end

       end

    end

end

function w = wj(N)

    %{

    生成N×1全零阵。

    生成一个N行,1列的全0列向量。

    行数N是采样点的个数。

    %}

    w = zeros(N, 1);

    %{

    对列向量w进行添值,添的值128个采样点变换到频域后的纵坐标。

    该纵坐标的值为复数。

    %}

    for j = 0 : N - 1

        w(j + 1) = cos(2 * pi * j / N) - 1i * sin(2 * pi * j / N);

        1i;

    end

    %  填充后的列向量w中的值全为复数。

end

四.实验结果

 

图4-1

时域信号上的8个点,转换到频域后,每个点对应的频率如图4-2所示,对应的振幅如图4-3所示。

 

图4-2. 列向量f中存储的8个点频率

 

图4-3. 列向量mag中存储的8个点振幅

 

图4-4. 列向量y中存储的复数

通过快速傅里叶变换,时域信号上采样的8个点,转换到了频域上,通过频谱图表现了出来。

 

© 著作权归作者所有

共有 人打赏支持
上一篇: Python安装教程
下一篇: 高斯白噪声
天蚕宝衣
粉丝 22
博文 239
码字总数 179255
作品 0
天津
私信 提问
两把王者荣耀的时间学会Python图片打码技能——「实验一小时」今晚开启!

关注「实验楼」,每天分享一个项目教程 「 实验一小时 」今晚开启,实验楼技术天团带你一小时做一个项目。 今晚 7:30 ,曾任职于腾讯、盛大等一线互联网公司的天火老师,将在B站带来免费直播...

moy37rqw1jarn33bgzk
04/18
0
0
CVPR 2018 | 英特尔实验室让 AI 在夜间也能拍出精彩照片

雷锋网(公众号:雷锋网)按:本文为雷锋字幕组编译的技术博客,原标题 AI is Taking Low-Light Photography to the Next Level,作者为 MICHAEL ZHANG。 翻译 | 程炜 整理 | 凡江 来自伊利诺伊...

雷锋字幕组
05/25
0
0
OpenCV视频计算机视觉图像识别实战Python

百度网盘 ├─第01讲 工欲善其事必先利其器-图像处理基础│ cv第一次资料.rar│ 第一课.mkv│ ├─第02讲 初探计算机视觉│ cv_第一二讲.pdf│ cv第二次资料.rar│ 第二课.mkv│ ├─第03讲 ...

远近高低各不同
11/09
0
0
从零开始搭建「图像处理实验」平台(React&Flask&MongoDB)

为了争取提前毕业,最近需要做大量图像处理的实验,改代码、调参、存结果,由于专注于实验,所以丝毫没顾及代码质量,又懒得重构,导致今天写的代码明天就忘了什么意思,加上实验室同学可能将...

刘开心_8a6c
11/26
0
0
如何让摄像头变成“暗夜之眼”?英特尔开发了一套基于FCN的成像系统

翻译 | 林椿眄 出品 | AI 科技大本营(公众号ID:rgznai100) 【AI科技大本营导读】手机拍照的重要性不必多说,不论是国外的苹果、三星,还是国内的华为、小米,都在提升拍照性能上下足了功夫...

dqcfkyqdxym3f8rb0
05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

缓存

并发情况下发生的缓存问题: 缓存一致性: 缓存穿透:是指在高并发场景下,如果某一个key被高并发的访问,缓存没有命中,出于容错性的考虑,会去数据库获取数据,从而导致大量请求访问数据库...

wuyiyi
11分钟前
1
0
eclipse 和idea 快捷键对照

分类 功能点 Eclipse快捷键 IDEA快捷键 搜索 搜索文本 Ctrl + F Ctrl + F Ctrl + R 查找替换 Alt + P/A 逐个/全部替换 Alt + F3 查找当前选中词 继续搜索 Ctrl + K 向前 Ctrl + Shift + K 向...

郭恩洲_OSC博客
12分钟前
2
0
PowerHA IP 替换方式与IP 别名方式的区别

IPAT via replacement (IP替换) The service IP label replaces the boot IP address on the interface. The heartbeat IP alias address remains. IPAT via aliasing (IP别名) The servic......

突突突酱
16分钟前
2
0
Kafka 几个重要的配置总结

注意:配置基于Kafka 0.8.2.1 broker配置 #非负整数,用于唯一标识broker broker.id 0 #kafka持久化数据存储的路径,可以指定多个,以逗号分隔 log.dirs /tmp/kafka-logs #broker接收连接请求...

hblt-j
17分钟前
2
0
开发函数计算的正确姿势 —— 排查超时问题

写不尽的 code,查不完的 bug 通常我们写 bug,哦,不对,写代码时总不会一帆风顺,往往各种 bug 充斥其中,即使测试有较高的代码覆盖率往往也会有漏网之鱼。能写出一些比较隐蔽或者看起来像...

阿里云官方博客
21分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部