图像处理技术第五次实验
图像处理技术第五次实验
天蚕宝衣 发表于8个月前
图像处理技术第五次实验
  • 发表于 8个月前
  • 阅读 5
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

一. 实验目的

掌握快速傅里叶变换。

二. 实验内容

通过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个点,转换到了频域上,通过频谱图表现了出来。

 

共有 人打赏支持
粉丝 16
博文 222
码字总数 146332
×
天蚕宝衣
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: