欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python傅里叶变换例子

程序员文章站 2022-03-10 22:17:39
本质:就是对信号进行基变换,只不过新的基是正弦/余弦波罢了我有一个东西,长得特别难看,数学性质特别差,傅立叶变换就是用性质很好的三角函数一部分一部分的去逼近它,最后得出一个看起来很复杂实际上数学性质很好的东西。代码:# -*- coding: utf-8 -*-import osimport numpy as npimport cv2import numpy as npfrom scipy.fftpack import fft, ifftimport matplotli....

本质:

就是对信号进行基变换,只不过新的基是正弦/余弦波罢了

我有一个东西,长得特别难看,数学性质特别差,傅立叶变换就是用性质很好的三角函数一部分一部分的去逼近它,最后得出一个看起来很复杂实际上数学性质很好的东西。

 

代码:

# -*- coding: utf-8 -*-
import os
import numpy as np
import cv2

import numpy as np
from scipy.fftpack import fft, ifft
import matplotlib.pyplot as plt
from matplotlib.pylab import mpl
from mpl_toolkits.mplot3d import Axes3D
import time

mpl.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
mpl.rcParams['axes.unicode_minus'] = False  # 显示负号

# 采样点选择1400个,因为设置的信号频率分量最高为600赫兹,根据采样定理知采样频率要大于信号频率2倍
a = 0
while a < 100:
    a += 1
    x = np.linspace(0, 1, 1024)

    # 设置需要采样的信号,频率分量有200,400和600
    i = np.random.randint(10, size=3)
    fr = np.random.randint(512, size=3)

    y = i[0] * np.sin(2 * np.pi * fr[0] * x) + i[1] * np.sin(2 * np.pi * fr[1] * x) + i[2] * np.sin(
        2 * np.pi * fr[2] * x)

    fft_y = fft(y)  # 快速傅里叶变换

    N = x.size
    x = np.arange(N)  # 频率个数
    half_x = x[range(int(N / 2))]  # 取一半区间
    time.sleep(1)
    abs_y = np.abs(fft_y)  # 取复数的绝对值,即复数的模(双边频谱)
    angle_y = np.angle(fft_y)  # 取复数的角度
    normalization_y = abs_y / N  # 归一化处理(双边频谱)
    normalization_half_y = normalization_y[range(int(N / 2))]  # 由于对称性,只取一半区间(单边频谱)
    plt.clf()  # 清除刷新前的图表,防止数据量过大消耗内存
    plt.subplot(231)
    plt.plot(x, y)
    plt.title('原始波形')

    plt.subplot(232)
    plt.plot(x, fft_y, 'black')
    plt.title('双边振幅谱(未求振幅绝对值)', fontsize=9, color='black')

    plt.subplot(233)
    plt.plot(x, abs_y, 'r')
    plt.title('双边振幅谱(未归一化)', fontsize=9, color='red')

    plt.subplot(234)
    plt.plot(x, angle_y, 'violet')
    plt.title('双边相位谱(未归一化)', fontsize=9, color='violet')

    plt.subplot(235)
    plt.plot(x, normalization_y, 'g')
    plt.title('双边振幅谱(归一化)', fontsize=9, color='green')

    plt.subplot(236)
    plt.plot(half_x, normalization_half_y, 'blue')
    plt.title('单边振幅谱(归一化)', fontsize=9, color='blue')
    plt.pause(0.4)  # 设置暂停时间,太快图表无法正常显示

plt.ioff()  # 关闭画图的窗口,即关闭交互模式
plt.show()

 

本文地址:https://blog.csdn.net/jacke121/article/details/111881350

相关标签: python