-
2021-04-18 05:04:44
【期刊名称】微型电脑应用 【年(卷),期】2018(034)009 【总页数】3 【关键词】 信号与系统; 幅度谱; 相位谱; Matlab 基金项目:国家自然科学基金(61401401) ......
MATLAB 实现信号的幅度调制与解调 利用 MATLAB 实现信号的幅度调制与解调摘 要 本文主要研究的内容是利用 MATLAB 实现信号幅度调制与解调以及 MATLAB 中信号 表示的......
实验4 连续信号与系统的频域分析及 MATLAB 实现一、实验目的: 1.用 MATLAB 实现非周期连续信号的傅里叶变换,并绘制出幅度谱和相位谱,利用仿真结果进一步加深对......
关键词 :信号与 系统 ;幅度 谱 ;相位谱;Matlab 中图分类号:TN91...
二:详细程序及仿真波形分析 1.连续时间信号 x(t ) 及其 200 Hz / 500 Hz /1000 Hz 频率抽样信号函数 x(n) % 绘制信号 x(n)的幅度谱和相位谱 clc ......
图像幅度谱,加 log 便于显示 phase=log(angle(f)*180/pi); %图像相位谱 l...(y1); % 数据类型转换,MATLAB 不支持图像的无符号整型的计算 g=fft2(f); ......
实验目的二、实验要求学习使用 Matlab,完成实验文档中第四单元所标注的所有实验题...基本题(g)代码如下: 所得图像为:可见 X 与 Y 幅度谱一致但是相位谱有区别......
改变 N,观察 N 的取值对频谱的最大值、过零点、 第一旁瓣幅度与最大值的比值以及相位谱的影响; 2)固定 N,改变 M,观察 M 的取值对幅度谱和相位谱的影响。...
('w'),ylabel('幅角'); title ('1000Hz 理想采样信号序列的相位谱') 运行此 MATLAB 程序,根据提示输入: 幅度因子 A=444.128,衰减因子 a=222.144,模拟角......
('w'),ylabel('幅角'); title ('1000Hz 理想采样信号序列的相位谱') 运行此 MATLAB 程序,根据提示输入: 幅度因子 A=444.128,衰减因子 a=222.144,模拟角......
('幅度谱') xlabel('nw'); subplot(2,1,2); stem(n,angle(X),'file'); title('相位谱') (2)对于三角波信号的频谱是:Cn=- + + n=-15:15; X......
('Fn'); 实验四 非周期信号的频域分析 一、实验目的 理解非周期信号的频域分析方法,掌握典型信号的幅度谱和相位谱,理解信 号的调制特性,掌握傅里叶变换的性质:......
并用 fft 指令 计算其频谱,做出幅度谱和相位谱,与理论结果进行对比。(2) 用...3 Matlab 代码详述 clear; clc; fs=1e6; t1=0:1/fs:0.1; %计算时间......
('幅度谱') xlabel('nw'); subplot(2,1,2); stem(n,angle(X),'file'); title('相位谱') (2)对于三角波信号的频谱是:Cn=- + + n=-15:15; X......
('T=15ms'); 3 2、分别利用 Matlab 符号运算求解法和数值计算法求下图所示信号的 FT,并画出其频 谱图(包括幅度谱和相位谱)[注:图中时间单位为:毫秒(ms......
('Fn'); 实验四 非周期信号的频域分析 一、实验目的 理解非周期信号的频域分析方法,掌握典型信号的幅度谱和相位谱,理解信号的调 制特性,掌握傅里叶变换的性质:......
('幅度谱') xlabel('nw'); subplot(2,1,2); stem(n,angle(X),'file'); title('相位谱') (2)对于三角波信号的频谱是:Cn=- + + n=-15:15; X......
信号与系统课后 matlab 作业 This manuscript was ...('幅度谱') xlabel('nw'); subplot(2,1,2);...('相位谱') (2)对于三角波信号的频谱是:Cn=-n......
(2)利用 matlab 函数绘制给定信号的幅度谱和相位谱。 (3)设计绘制调制...
实验条件需要一台 PC 机和一定的 matlab 编程能力 三、实验内容 2、分别利用 Matlab 符号运算求解法和数值计算法求下图所示信号的 谱图(包括幅度谱和相位谱)[......
更多相关内容 -
求图像的相位和幅度谱_幅度相位_求图像的相位和幅度谱_
2021-09-30 12:23:58通过MATLAB求取图像的相位谱和幅度谱,文件包含读取的图像,请放在同一路径下 -
rmax_零中心_零中心归一化瞬时幅度谱密度最大值
2021-09-11 14:39:392ask、2fsk、2psk、msk四种信号的零中心归一化瞬时幅度谱密度最大值 -
信号的幅度谱和相位谱(傅立叶变换):计算具有所需频率分辨率的幅度谱并使用阈值改进相位谱-matlab开发
2021-06-01 00:05:39ft_spect(2.0 版)计算具有所需频率分辨率的输入信号的幅度和相位谱,并过滤相位谱以抑制浮动舍入误差。 注意#1:ft_spect 不能消除频谱泄漏。 注意#2:离散傅立叶变换 (DFT) 将输入信号视为周期信号的一个周期,... -
PSD(功率谱密度)和带调整 FFT 的幅度谱:FFT 计算 PSD 和 1d 信号的一侧幅度谱 Y[f]-matlab开发
2021-06-01 10:50:441) 计算功率谱密度和幅度谱 (P(f),F(f)) 1d 信号 y(t) 的采样率 Fs(奈奎斯特率),这是已知的% apriori。 结果绘制在 3 幅图中,对应于简单的PSD,分别为对数 PSD (dB) 和幅度谱。 _____________ 振幅(f) = \/ PSD... -
MATLAB根据相位谱和幅度谱重建图像
2017-12-23 12:26:11在MATLAB下,导入图像,对图像做傅里叶变换,之后根据相位谱和幅度谱对图像进行单独重建,主要用于分析相位谱和幅度谱所含有的信息 -
rmax_零中心_零中心归一化瞬时幅度谱密度最大值_源码.zip
2021-10-05 22:09:24rmax_零中心_零中心归一化瞬时幅度谱密度最大值_源码.zip -
图像处理离散傅里叶变换频谱相位谱幅度谱关系
2019-01-12 19:03:42整理的图像处理离散傅里叶变换频谱相位谱幅度谱关系ppt,及matlab代码 -
变化 p 的 LPC 分析:说明 LPC 多项式对数幅度谱与 STFT 对数幅度的匹配行为-matlab开发
2021-05-30 06:33:48语音处理指定了一个由 Lawrence Rabiner ... 这个 MATLAB 练习说明了 LPC 多项式对数幅度谱与指定输入语音帧的 STFT 的对数幅度谱的匹配行为,作为 LPC 阶数 p 的函数,对于 p 值范围; 例如,p = 10; 20; 30; 40; 50. -
lpc 变化 L:这个练习展示了 STFT 的 LPC 多项式对数幅度谱的匹配行为。-matlab开发
2021-05-30 06:27:19这个 MATLAB 练习说明了 LPC 多项式对数幅度谱与指定输入语音帧的 STFT 的对数幅度谱的匹配行为,作为帧大小的函数,Lm 的值范围; (例如,Lm =Linit、Linit+Ldelta、...、Linit+4*Ldelta)毫秒。 本练习处理语音... -
由已知幅度谱及部分采样点恢复信号与采样频率的关系 (1988年)
2021-06-11 23:04:38恢复信号所需的已知采样点数占信号总长度的比例P与采样频率有关,在一定条件下,提高采样频率,可使P远小于三分之一。已知的采样点可不限于从信号的第一点开始,也不限于是一段连续的采样点。... -
rmax_零中心_零中心归一化瞬时幅度谱密度最大值_源码.rar
2021-09-29 00:20:12rmax_零中心_零中心归一化瞬时幅度谱密度最大值_源码.rar -
FFT分析幅度谱和相位谱.zip源码Labview个人项目资料程序资源下载
2022-04-15 21:05:57FFT分析幅度谱和相位谱.zip源码Labview个人项目资料程序资源下载FFT分析幅度谱和相位谱.zip源码Labview个人项目资料程序资源下载FFT分析幅度谱和相位谱.zip源码Labview个人项目资料程序资源下载FFT分析幅度谱和相位... -
利用幅度谱和相位谱重构图像
2020-07-18 21:35:23图像的频域空间包含幅度谱以及相位谱,其中幅度谱反映的是图像的灰度信息,相位谱反应的是图像的位置信息,如轮廓。 本博文将基于傅里叶分析理论演示利用幅度谱与相位谱重构图像的过程,并验证幅度谱与相位谱在图像...一、概要
图像经过傅里叶变换后,将图像在空域中的信息映射至频域空间中。图像的频域空间包含幅度谱以及相位谱,其中幅度谱反映的是图像的灰度信息,相位谱反应的是图像的位置信息,如轮廓。
本博文将基于傅里叶分析理论演示利用幅度谱与相位谱重构图像的过程,并验证幅度谱与相位谱在图像重构过程中的作用,最后在本文末给出全部代码。
二、图像的傅里叶变换及其可视化
首先将图像进行傅里叶变换得到图像的频谱并使其可视化。在这里应当注意傅里叶变换对是复数,因此需要构建双通道的Mat类存储复数的实部与虚部。
代码的主函数部分:int main() { Mat src = imread("T.jpg"); Mat gray_src; cvtColor(src, gray_src, CV_BGR2GRAY); imshow("灰度化输入图像", gray_src); int m = getOptimalDFTSize(gray_src.rows); int n = getOptimalDFTSize(gray_src.cols); Mat padded; copyMakeBorder(gray_src, padded, 0, m - gray_src.rows, 0, n - gray_src.cols, BORDER_CONSTANT, Scalar::all(0)); padded.convertTo(padded, CV_32FC1); //中心化 for (int row = 0; row < padded.rows; row++) { for (int col = 0; col < padded.cols; col++) { padded.at<float>(row, col) *= pow(-1, row + col); } } Mat planes[] = { Mat_<float>(padded),Mat::zeros(padded.size(),CV_32F) }; Mat complexI; merge(planes, 2, complexI); dft(complexI, complexI); split(complexI, planes); //显示幅度谱和相位谱 Show_Spectrum(planes[0], planes[1]); //利用相位谱重构图像 Phase_Spectrum_Reconstruction(planes[0], planes[1]); //利用幅度谱重构图像 Amplitude_Spectrum_Reconstruction(planes[0], planes[1]); //利用幅度谱和相位谱重构图像 Amplitude_Phase_Spectrum_Reconstruction(planes[0], planes[1]); waitKey(0); system("pause"); return 0; }
对图像求得傅里叶变换后,将图像的频谱可视化。该部分的子函数如下所示:
//根据幅度谱的定义计算傅里叶变换的幅度谱 Mat Magnitude(Mat Re, Mat Im) { Mat rst = Mat::zeros(Re.rows, Re.cols, CV_32F); for (int row = 0; row < Re.rows; row++) { for (int col = 0; col < Re.cols; col++) { rst.at<float>(row, col) = sqrt(pow(Re.at<float>(row, col), 2) + pow(Im.at<float>(row, col), 2)); } } return rst; } //根据相位谱的定义计算傅里叶变换的相位谱 Mat Phase(Mat Re, Mat Im) { Mat rst = Mat::zeros(Re.rows, Re.cols, CV_32F); for (int row = 0; row < Re.rows; row++) { for (int col = 0; col < Re.cols; col++) { rst.at<float>(row, col) = atan2(Im.at<float>(row, col), Re.at<float>(row, col)); } } return rst; } //显示图像的相位谱和幅度谱 void Show_Spectrum(Mat Re, Mat Im) { Mat amplitude = Magnitude(Re, Im); Mat angle = Phase(Re, Im); amplitude += Scalar::all(1); log(amplitude, amplitude); normalize(amplitude, amplitude, 0, 1, NORM_MINMAX); normalize(angle, angle, 0, 1, NORM_MINMAX); imshow("图像傅里叶变换的幅度谱", amplitude); imshow("图像傅里叶变换的相位谱", angle); }
本例使用泰勒斯威夫特的图片进行演示,输入图像如下:
将上图灰度化后得到单通道的灰度图像,对该灰度图像进行傅里叶变换后得到的幅度谱如下图所示:
相位谱如下图所示:
三、利用相位谱重构图像
经过上面的傅里叶变换容易得到图像的相位谱与幅度谱,此时图像的傅里叶谱为|F(u,v)|*exp(jφ(u,v))。令|F(u,v)|=1,得到图像的相位谱exp(jφ(u,v))。最后利用欧拉公式得到: exp(jφ(u,v))=cos(φ(u,v))+jsin(φ(u,v))。
代码实现时创建一个双通道的Mat类存储相位谱的实部与虚部,然后对相位谱进行傅里叶反变换即可。
该部分的子函数如下所示:void Phase_Spectrum_Reconstruction(Mat Re, Mat Im) { Mat angle = Phase(Re, Im); Mat Phase_Spectrum = Mat::zeros(angle.rows, angle.cols, CV_32FC2);//定义一个双通道的Mat类分别存储相位谱的实部与虚部 for (int row = 0; row < Phase_Spectrum.rows; row++) { for (int col = 0; col < Phase_Spectrum.cols; col++) { Phase_Spectrum.at<Vec2f>(row, col)[0] = cos(angle.at<float>(row, col));//实部 Phase_Spectrum.at<Vec2f>(row, col)[1] = sin(angle.at<float>(row, col));//虚部 } } idft(Phase_Spectrum, Phase_Spectrum); Mat temp[] = { Mat_<float>(angle),Mat::zeros(angle.size(),CV_32F) }; split(Phase_Spectrum, temp); magnitude(temp[0], temp[1], temp[0]); normalize(temp[0], temp[0], 0, 1, CV_MINMAX); imshow("相位谱重构图像", temp[0]); }
利用相位谱重构的图像如下图所示:
利用相位谱很好的将图像的轮廓信息重构了出来,由此容易验证图像的相位谱存储的是图像的位置信息。但是由于缺乏幅度谱,因此重构后的图像缺少像素值上的变化。
四、利用幅度谱重构图像
令图像的傅里叶谱|F(u,v)|*exp(jφ(u,v))中的相位谱φ(u,v)等于0,得到幅度谱|F(u,v)|,然后对幅度谱进行傅里叶变换重构图像。
该部分的子函数如下所示:void Amplitude_Spectrum_Reconstruction(Mat Re, Mat Im) { Mat amplitude = Magnitude(Re, Im); Mat Amplitude_Spectrum = Mat::zeros(amplitude.rows, amplitude.cols, CV_32FC2);//定义一个双通道的Mat类分别存储幅度谱谱的实部与虚部 for (int row = 0; row < Amplitude_Spectrum.rows; row++) { for (int col = 0; col < Amplitude_Spectrum.cols; col++) { Amplitude_Spectrum.at<Vec2f>(row, col)[0] = amplitude.at<float>(row, col)*pow(-1, row + col);//实部 Amplitude_Spectrum.at<Vec2f>(row, col)[1] = 0;//虚部 } } idft(Amplitude_Spectrum, Amplitude_Spectrum); Mat temp[] = { Mat_<float>(amplitude),Mat::zeros(amplitude.size(),CV_32F) }; split(Amplitude_Spectrum, temp); magnitude(temp[0], temp[1], temp[0]); normalize(temp[0], temp[0], 0, 1, CV_MINMAX); imshow("幅度谱重构图像", temp[0]); }
利用幅度谱重构图像得到的结果如下图所示:
由幅度谱无法重构原来的图像,这也验证了幅度谱只包含图像的灰度信息,对图像内容起决定性作用的是图像的相位谱。
五、利用幅度谱和相位谱重构图像
利用欧拉公式得到:|F(u,v)|*exp(jφ(u,v))=|F(u,v)|*cos(φ(u,v))+j|F(u,v)|*sin(φ(u,v))。
代码实现时创建一个双通道的Mat类存储上述傅里叶谱的实部与虚部,然后对其进行傅里叶反变换即可。
该部分的子函数如下所示:void Amplitude_Phase_Spectrum_Reconstruction(Mat Re, Mat Im) { Mat angle = Phase(Re, Im); Mat amplitude = Magnitude(Re, Im); Mat Amplitude_Phase_Spectrum = Mat::zeros(angle.rows, angle.cols, CV_32FC2);//定义一个双通道的Mat类分别存储相位谱的实部与虚部 for (int row = 0; row < Amplitude_Phase_Spectrum.rows; row++) { for (int col = 0; col < Amplitude_Phase_Spectrum.cols; col++) { Amplitude_Phase_Spectrum.at<Vec2f>(row, col)[0] = amplitude.at<float>(row, col)*cos(angle.at<float>(row, col));//实部 Amplitude_Phase_Spectrum.at<Vec2f>(row, col)[1] = amplitude.at<float>(row, col)*sin(angle.at<float>(row, col));//虚部 } } idft(Amplitude_Phase_Spectrum, Amplitude_Phase_Spectrum); Mat temp[] = { Mat_<float>(angle),Mat::zeros(angle.size(),CV_32F) }; split(Amplitude_Phase_Spectrum, temp); magnitude(temp[0], temp[1], temp[0]); normalize(temp[0], temp[0], 0, 1, CV_MINMAX); imshow("利用幅度谱和相位谱重构图像", temp[0]); }
利用图像的幅度谱和相位谱重构的图像如下图所示:
很显然利用图像的幅度谱与相位谱完美的重构了图像。
六、完整代码#include<iostream> #include<opencv2/opencv.hpp> #include<math.h> #include<complex.h> #include<complex> using namespace std; using namespace cv; Mat Magnitude(Mat Re, Mat Im); Mat Phase(Mat Re, Mat Im); void Show_Spectrum(Mat Re, Mat Im); void Phase_Spectrum_Reconstruction(Mat Re, Mat Im); void Amplitude_Spectrum_Reconstruction(Mat Re, Mat Im); void Amplitude_Phase_Spectrum_Reconstruction(Mat Re, Mat Im); int main() { Mat src = imread("T.jpg"); Mat gray_src; cvtColor(src, gray_src, CV_BGR2GRAY); imshow("灰度化输入图像", gray_src); int m = getOptimalDFTSize(gray_src.rows); int n = getOptimalDFTSize(gray_src.cols); Mat padded; copyMakeBorder(gray_src, padded, 0, m - gray_src.rows, 0, n - gray_src.cols, BORDER_CONSTANT, Scalar::all(0)); padded.convertTo(padded, CV_32FC1); //中心化 for (int row = 0; row < padded.rows; row++) { for (int col = 0; col < padded.cols; col++) { padded.at<float>(row, col) *= pow(-1, row + col); } } Mat planes[] = { Mat_<float>(padded),Mat::zeros(padded.size(),CV_32F) }; Mat complexI; merge(planes, 2, complexI); dft(complexI, complexI); split(complexI, planes); //显示幅度谱和相位谱 Show_Spectrum(planes[0], planes[1]); //利用相位谱重构图像 Phase_Spectrum_Reconstruction(planes[0], planes[1]); //利用幅度谱重构图像 Amplitude_Spectrum_Reconstruction(planes[0], planes[1]); //利用幅度谱和相位谱重构图像 Amplitude_Phase_Spectrum_Reconstruction(planes[0], planes[1]); waitKey(0); system("pause"); return 0; } Mat Magnitude(Mat Re, Mat Im) { Mat rst = Mat::zeros(Re.rows, Re.cols, CV_32F); for (int row = 0; row < Re.rows; row++) { for (int col = 0; col < Re.cols; col++) { rst.at<float>(row, col) = sqrt(pow(Re.at<float>(row, col), 2) + pow(Im.at<float>(row, col), 2)); } } return rst; } Mat Phase(Mat Re, Mat Im) { Mat rst = Mat::zeros(Re.rows, Re.cols, CV_32F); for (int row = 0; row < Re.rows; row++) { for (int col = 0; col < Re.cols; col++) { rst.at<float>(row, col) = atan2(Im.at<float>(row, col), Re.at<float>(row, col)); } } return rst; } void Show_Spectrum(Mat Re, Mat Im) { Mat amplitude = Magnitude(Re, Im); Mat angle = Phase(Re, Im); amplitude += Scalar::all(1); log(amplitude, amplitude); normalize(amplitude, amplitude, 0, 1, NORM_MINMAX); normalize(angle, angle, 0, 1, NORM_MINMAX); imshow("图像傅里叶变换的幅度谱", amplitude); imshow("图像傅里叶变换的相位谱", angle); } void Phase_Spectrum_Reconstruction(Mat Re, Mat Im) { Mat angle = Phase(Re, Im); Mat Phase_Spectrum = Mat::zeros(angle.rows, angle.cols, CV_32FC2);//定义一个双通道的Mat类分别存储相位谱的实部与虚部 for (int row = 0; row < Phase_Spectrum.rows; row++) { for (int col = 0; col < Phase_Spectrum.cols; col++) { Phase_Spectrum.at<Vec2f>(row, col)[0] = cos(angle.at<float>(row, col));//实部 Phase_Spectrum.at<Vec2f>(row, col)[1] = sin(angle.at<float>(row, col));//虚部 } } idft(Phase_Spectrum, Phase_Spectrum); Mat temp[] = { Mat_<float>(angle),Mat::zeros(angle.size(),CV_32F) }; split(Phase_Spectrum, temp); magnitude(temp[0], temp[1], temp[0]); normalize(temp[0], temp[0], 0, 1, CV_MINMAX); imshow("相位谱重构图像", temp[0]); } void Amplitude_Spectrum_Reconstruction(Mat Re, Mat Im) { Mat amplitude = Magnitude(Re, Im); Mat Amplitude_Spectrum = Mat::zeros(amplitude.rows, amplitude.cols, CV_32FC2);//定义一个双通道的Mat类分别存储幅度谱谱的实部与虚部 for (int row = 0; row < Amplitude_Spectrum.rows; row++) { for (int col = 0; col < Amplitude_Spectrum.cols; col++) { Amplitude_Spectrum.at<Vec2f>(row, col)[0] = amplitude.at<float>(row, col)*pow(-1, row + col);//实部 Amplitude_Spectrum.at<Vec2f>(row, col)[1] = 0;//虚部 } } idft(Amplitude_Spectrum, Amplitude_Spectrum); Mat temp[] = { Mat_<float>(amplitude),Mat::zeros(amplitude.size(),CV_32F) }; split(Amplitude_Spectrum, temp); magnitude(temp[0], temp[1], temp[0]); normalize(temp[0], temp[0], 0, 1, CV_MINMAX); imshow("幅度谱重构图像", temp[0]); } void Amplitude_Phase_Spectrum_Reconstruction(Mat Re, Mat Im) { Mat angle = Phase(Re, Im); Mat amplitude = Magnitude(Re, Im); Mat Amplitude_Phase_Spectrum = Mat::zeros(angle.rows, angle.cols, CV_32FC2);//定义一个双通道的Mat类分别存储相位谱的实部与虚部 for (int row = 0; row < Amplitude_Phase_Spectrum.rows; row++) { for (int col = 0; col < Amplitude_Phase_Spectrum.cols; col++) { Amplitude_Phase_Spectrum.at<Vec2f>(row, col)[0] = amplitude.at<float>(row, col)*cos(angle.at<float>(row, col));//实部 Amplitude_Phase_Spectrum.at<Vec2f>(row, col)[1] = amplitude.at<float>(row, col)*sin(angle.at<float>(row, col));//虚部 } } idft(Amplitude_Phase_Spectrum, Amplitude_Phase_Spectrum); Mat temp[] = { Mat_<float>(angle),Mat::zeros(angle.size(),CV_32F) }; split(Amplitude_Phase_Spectrum, temp); magnitude(temp[0], temp[1], temp[0]); normalize(temp[0], temp[0], 0, 1, CV_MINMAX); imshow("利用幅度谱和相位谱重构图像", temp[0]); }
-
幅度谱 fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱
2021-04-22 02:50:00幅度谱 fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱数字图像处理实验报告姓名日期:一、 实验要求(1) 熟悉fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱(2) 用matlab读取和显示二、 ...幅度谱 fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱
数字图像处理实验报告
姓名日期:
一、 实验要求
(1) 熟悉fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱
(2) 用matlab读取和显示
二、 实验代码
sina=imread('E:\数字图像处理\exp2\伊伽贝拉.jpg' ); %输入图像 if isrgb(sina)
sina=rgb2gray(sina);
end
subplot(3,2,1)
imshow(uint8(sina))
title('原图');
I1=fft2(sina);
I1=fftshift(I1);
d1=log10(1+3*I1);
subplot(3,2,2)
imshow(d1,) %如果图像为RGB则转换为灰度图 %显示图像 %对图像进行傅里叶变换 %进行对数运算
sina1=imrotate(sina,30);
subplot(3,2,3)
imshow(uint8(sina1))
title('旋转图');
I2=fft2(sina1);
I2=fftshift(I2);
d2=log10(1+3*I2);
subplot(3,2,4)
imshow(d2,)
sina2=imresize(sina,5);
subplot(3,2,5)
imshow(uint8(sina2))
title('缩放图');
I3=fft2(sina2);
I3=fftshift(I3);
d3=log10(1+3*I3);
subplot(3,2,6)
imshow(d3,)
=size(sina);
X=zeros(m,n) %旋转图 %缩放图 %存放变换后的图像
幅度谱 fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱
A=
for i=1:m
for j=1:n
x=A(1,1)*j+A(2,1)*i+A(3,1);
y=A(1,2)*j+A(2,2)*i+A(3,2); %变换后坐标
x=round(x); %取整 y=round(y);
if((x>0)&&(x0)&&(y
I4(i,j)=0;
end
end
end
三、 实验结果截图并做分析
幅度谱 fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱
原
幅度谱 fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱
幅度谱 fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱
图
旋转
幅度谱 fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱
幅度谱 fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱
图
缩放
幅度谱 fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱
图
幅度谱 fft2绘制图像的对数幅度谱,比较图像旋转、平移和缩放后的频谱
内容由用户发布,不代表本站观点。如发现有害或侵权内容。请点击这里
-
傅里叶幅度谱的平滑功能:smoothSpectra 为傅里叶幅度谱提供了不同的平滑选项。 默认窗口函数是 Konno-...
2021-05-29 10:46:11smoothSpectra 为傅立叶幅度谱 (FAS) 提供各种不同的窗口平滑选项,包括 boxcar、triangle、Parzen、Hann、Hanning、Hamming、Gaussian。 默认窗口函数是 Konno-Ohmachi(参见 Konno 和 Ohmachi(1998),第 234 页... -
MATLAB 交换两幅图像的幅度谱和相位谱,并实现双谱重构
2012-04-13 10:29:54交换两幅图像的幅度谱和相位谱,并实现双谱重构!附有源代码和实验结构图。 -
幅度谱、相位谱、能量谱等语音信号处理中的基础知识
2020-11-03 15:19:45目录写在前面的话一、时域信号获取1.1 python读取.wav文件1.1.1 soundfile1.1.2 scipy1.1.3 总结二、频谱特征2.1 傅里叶变换后的信号2.2 幅度谱(magnitude spectrogram)2.3 相位谱(phase spectrogram)2.5 能量谱...目录
写在前面的话
准备根植于语音信号处理这一领域,所以在此对于自己已了解的频谱特征进行总结。非通信专业,若有疏漏,希望可以在评论区指出,谢谢。
一、时域信号获取
在科研方面,我们用的语音信号一般均是
.wav
或.pcm
格式。就个人而言,使用.wav
最为频繁。1.1 python读取.wav文件
1.1.1 soundfile
import soundfile as sf clean_sig, sr = sf.read('./datasets/SX97_-5_leopard_014930_speech.wav') print('内容:' + str(clean_sig)) print('形状:' + str(clean_sig.shape)) print('采样率:' + str(sr)) print('类型:' + str(clean_sig.dtype))
输出:
内容:[ 3.05175781e-05 -3.05175781e-05 -6.10351562e-05 ... 3.05175781e-05 3.05175781e-05 1.83105469e-04] 形状:(32871,) 采样率:16000 类型:float64
1.1.2 scipy
from scipy.io import wavfile # 注意此方法返回的结果,采样率是第一个参数,信号是第二个参数 sr, clean_sig = wavfile.read('./datasets/SX97_-5_leopard_014930_speech.wav') print('内容:' + str(clean_sig)) print('形状:' + str(clean_sig.shape)) print('采样率:' + str(sr)) print('类型:' + str(clean_sig.dtype))
输出:
内容:[ 1 -1 -2 ... 1 1 6] 形状:(32871,) 采样率:16000 类型:int16
1.1.3 总结
可以看到两种方法读出来的数据形状一样,但是内容差距很大。原因是,wav音频绝大部分以16位整形数据存在文件中。
soundfile
读取出来的是原始音频信息,而‘scipy.io’中读出来的整数,其实scipy.io
中读出来的是将数值等比例缩放了 2 15 2^{15} 215倍,也就是乘了 2 15 2^{15} 215=32768,如: 3.05175791 ∗ 1 0 − 5 ∗ 32768 = 1.0000000319 3.05175791 * 10^{-5} * 32768 = 1.0000000319 3.05175791∗10−5∗32768=1.0000000319
因此可以看出,soundfile
的方法读出来的数据要比scipy.io
读出来的更为精确。
对于读出的数据每个值,我们称之为采样点,sr
为采样率,两者的关系是:采样率是指在1秒内,对信号采样的次数,如:16000采样率(16kHz)表示在1秒的时间内,对信号采样16000次,即16000个采样点表示1秒种的语音。二、频谱特征
频谱特征是指在频域上的信号特征,我们采用短时傅里叶变换(short-time Fourier transform, STFT)将时域信号变换到频域上。有关傅里叶变换的知识以后总结。
2.1 傅里叶变换后的信号
在这里,我们使用
librosa
包中的stft
方法将时域信号变换到频域。import soundfile as sf import librosa clean_sig, sr = sf.read('./datasets/SX97_-5_leopard_014930_speech.wav') clean_spec = librosa.stft(clean_sig, win_length=320, hop_length=160, n_fft=320) print('内容:' + str(clean_spec)) print('形状:' + str(clean_spec.shape))
输出:
内容:[[ 8.76316987e-03+0.0000000e+00j 1.29083162e-02+0.0000000e+00j 9.13359132e-03+0.0000000e+00j ... 7.62358448e-03+0.0000000e+00j 7.58317392e-03+0.0000000e+00j 1.10339485e-02+0.0000000e+00j] [-1.75022508e-03+4.3040286e-19j -7.37327803e-03-1.4874971e-03j -4.45753196e-03+1.2122139e-03j ... -3.66999581e-03+6.7065289e-04j -2.64038169e-03+1.6806803e-04j -5.55054098e-03-1.2115777e-04j] [-4.30344604e-03-6.1006659e-19j 5.33141894e-04+2.7573726e-04j 8.00883863e-04-1.3510550e-03j ... -3.78675119e-04-2.0164346e-04j -1.67590310e-03+4.1538148e-04j -4.49120067e-04+4.6450400e-04j] ... [ 9.26596869e-04-1.7111648e-19j -7.02931487e-04-9.0587000e-06j 7.64308905e-04-1.3586872e-04j ... -3.17405735e-04+6.6111665e-05j -6.93979207e-04+7.6773483e-04j -7.75805966e-04-7.5752003e-05j] [-8.64989765e-04+5.0811411e-20j 2.63431924e-04-1.3580784e-04j -2.29876296e-05+6.2994589e-04j ... 4.75295201e-05-3.6528043e-04j 4.57464193e-04-7.0705859e-04j 9.95153969e-05+4.5833897e-04j] [ 9.03499953e-04+0.0000000e+00j -1.09811270e-04+0.0000000e+00j -3.26593174e-04+0.0000000e+00j ... -1.62867364e-04+0.0000000e+00j 1.52526351e-04+0.0000000e+00j 4.80814284e-04+0.0000000e+00j]] 形状:(161, 206) 类型:complex64
可以看到,经过傅里叶变换后,信号类型变成了
complex64
,也就是复数。2.2 幅度谱(magnitude spectrogram)
有时候文章里还使用amplitude,在语音信号处理领域也译为幅度谱
将信号变换到频域上之后,对信号进行取模操作即可获取幅度谱。
import numpy as np import soundfile as sf import librosa clean_sig, sr = sf.read('./datasets/SX97_-5_leopard_014930_speech.wav') clean_spec = librosa.stft(clean_sig, win_length=320, hop_length=160, n_fft=320) mag = np.abs(clean_spec) print('内容:' + str(mag)) print('形状:' + str(mag.shape)) print('类型:' + str(mag.dtype))
输出:
内容:[[0.00876317 0.01290832 0.00913359 ... 0.00762358 0.00758317 0.01103395] [0.00175023 0.00752183 0.00461942 ... 0.00373077 0.00264573 0.00555186] [0.00430345 0.00060023 0.00157059 ... 0.00042902 0.00172661 0.00064612] ... [0.0009266 0.00070299 0.00077629 ... 0.00032422 0.0010349 0.0007795 ] [0.00086499 0.00029638 0.00063037 ... 0.00036836 0.00084214 0.00046902] [0.0009035 0.00010981 0.00032659 ... 0.00016287 0.00015253 0.00048081]] 形状:(161, 206) 类型:float32
2.3 相位谱(phase spectrogram)
将信号变换到频域上之后,对信号进行取相位角操作即可获取信号的相位谱(相位信息)。
import numpy as np import soundfile as sf import librosa clean_sig, sr = sf.read('./datasets/SX97_-5_leopard_014930_speech.wav') clean_spec = librosa.stft(clean_sig, win_length=320, hop_length=160, n_fft=320) phase = np.angle(clean_spec) print('内容:' + str(phase)) print('形状:' + str(phase.shape)) print('类型:' + str(phase.dtype))
输出为:
内容:[[ 0.0000000e+00 0.0000000e+00 0.0000000e+00 ... 0.0000000e+00 0.0000000e+00 0.0000000e+00] [ 3.1415927e+00 -2.9425230e+00 2.8760667e+00 ... 2.9608476e+00 3.0780256e+00 -3.1197679e+00] [-3.1415927e+00 4.7730723e-01 -1.0356996e+00 ... -2.6522865e+00 2.8986335e+00 2.3393579e+00] ... [-1.8467198e-16 -3.1287065e+00 -1.7592894e-01 ... 2.9362411e+00 2.3057790e+00 -3.0442581e+00] [ 3.1415927e+00 -4.7599661e-01 1.6072716e+00 ... -1.4414054e+00 -9.9653566e-01 1.3569930e+00] [ 0.0000000e+00 3.1415927e+00 3.1415927e+00 ... 3.1415927e+00 0.0000000e+00 0.0000000e+00]] 形状:(161, 206) 类型:float32
2.5 能量谱(power spectrogram)
对信号的幅度谱做平方操作,即可获取能量谱。
import numpy as np import soundfile as sf import librosa clean_sig, sr = sf.read('./datasets/SX97_-5_leopard_014930_speech.wav') clean_spec = librosa.stft(clean_sig, win_length=320, hop_length=160, n_fft=320) mag = np.abs(clean_spec) energy = mag ** 2 print('内容:' + str(energy)) print('形状:' + str(energy.shape)) print('类型:' + str(energy.dtype))
输出:
内容:[[7.67931488e-05 1.66624624e-04 8.34224920e-05 ... 5.81190397e-05 5.75045269e-05 1.21748017e-04] [3.06328775e-06 5.65778791e-05 2.13390540e-05 ... 1.39186450e-05 6.99986276e-06 3.08231829e-05] [1.85196477e-05 3.60271315e-07 2.46676450e-06 ... 1.84054940e-07 2.98119289e-06 4.17472791e-07] ... [8.58581757e-07 4.94194751e-07 6.02628347e-07 ... 1.05117145e-07 1.07102392e-06 6.07613288e-07] [7.48207299e-07 8.78401494e-08 3.97360225e-07 ... 1.35688850e-07 7.09205381e-07 2.19977920e-07] [8.16312138e-07 1.20585151e-08 1.06663101e-07 ... 2.65257789e-08 2.32642883e-08 2.31182369e-07]] 形状:(161, 206) 类型:float32
2.6 梅尔谱(mel spectrogram)
将幅度谱通过梅尔滤波器组,得到的结果就是梅尔谱。
import soundfile as sf import librosa clean_sig, sr = sf.read('./datasets/SX97_-5_leopard_014930_speech.wav') clean_mel_spec = librosa.feature.melspectrogram(clean_sig, sr=sr, win_length=320, hop_length=160, n_fft=320) print('内容:' + str(clean_mel_spec)) print('形状:' + str(clean_mel_spec.shape)) print('类型:' + str(clean_mel_spec.dtype))
输出:
内容:[[0.0000000e+00 0.0000000e+00 0.0000000e+00 ... 0.0000000e+00 0.0000000e+00 0.0000000e+00] [1.1288448e-07 2.0849377e-06 7.8636032e-07 ... 5.1291261e-07 2.5795026e-07 1.1358577e-06] [1.8121774e-08 3.3470297e-07 1.2623741e-07 ... 8.2339810e-08 4.1409734e-08 1.8234354e-07] ... [5.3398366e-09 2.5303654e-08 1.8074982e-08 ... 5.1210187e-09 4.2730499e-09 7.5652693e-09] [9.4773158e-09 1.9163979e-08 9.7578639e-09 ... 3.4058807e-09 7.2911930e-09 1.6748615e-08] [4.6306328e-09 2.6178222e-08 1.1558068e-08 ... 4.3883781e-09 1.4969601e-08 2.6740691e-08]] 形状:(128, 206) 类型:float32
在此处是直接使用的
librosa.feature.melspectrogram
方法,其实去看该方法的实现就可以看到,先做了_spectrogram()
,然后做了‘filters.mel()’。而_spectrogram()
方法是做了abs(stft())
2.7 梅尔倒谱系数(Mel-scale Frequency Cepstral Coefficients, MFCC)
MFCC,是对梅尔谱特征取对数操作后,提取倒谱参数(DCT)。
import soundfile as sf import librosa clean_sig, sr = sf.read('./datasets/SX97_-5_leopard_014930_speech.wav') clean_mfcc = librosa.feature.mfcc(clean_sig, sr=sr, n_mfcc=40) print('内容:' + str(clean_mfcc)) print('形状:' + str(clean_mfcc.shape)) print('类型:' + str(clean_mfcc.dtype))
输出:
内容:[[-7.4360229e+02 -7.4118781e+02 -7.4623761e+02 ... -6.4906628e+02 -6.8241693e+02 -7.1324139e+02] [ 1.0094034e+01 1.1340399e+01 9.1006794e+00 ... 5.2873005e+01 4.1353008e+01 3.2668667e+01] [ 2.4416672e+01 2.3510887e+01 1.7528904e+01 ... -3.7687920e+01 -2.2165060e+01 -5.7691031e+00] ... [-9.3942904e-01 1.3458931e-01 3.1641185e+00 ... 3.6823349e+00 1.2929006e+00 -3.8065696e-01] [-4.0057945e+00 -2.4740624e+00 2.5400662e+00 ... 5.5418024e+00 1.1933881e+00 -9.6134186e-01] [ 1.9161583e+00 6.8438768e-01 -2.7315216e+00 ... 2.4877858e+00 1.9765708e+00 -6.7191064e-01]] 形状:(40, 65) 类型:float32
三、总结
-
2.语音增强短时谱估计算法——幅度谱减法
2022-04-10 13:55:10需要对语音的短时幅度谱进行估计,这种方法没有使用参考噪声源,但他假设噪声是统计平稳的,既有语音期间与无语音间隙噪声振幅谱的期望值相等,用无语音期间的噪声频谱估计值代替有语音期间的 谱减法使用基础: 1... -
计算平滑傅里叶幅度谱(smoothFAS):该函数计算傅里叶幅度谱及其平滑版本。 为了平滑,它使用窗口平均。-...
2021-05-29 10:46:16计算平滑的傅立叶幅度谱 此函数计算傅立叶幅度谱及其平滑版本。 为了平滑,它使用基于窗口中值或均方根值的窗口平均。 默认窗口数为 20。代码还接受用户定义的窗口数值。 Windows 具有相同数量的数据点。 用法: ... -
如何在FFT幅度谱上绘制掩模线
2021-04-23 16:26:23嗨,我有图像上的FFT运算后的幅度谱,现在我要画一个掩模。但是使用霍夫线等,我得到太多的线和面具失败。下面是我需要创建的图像和蒙版的链接提前谢谢这是密码import cv2import numpy as npfrom matplotlib import ... -
求图像的相位和幅度谱_幅度相位_求图像的相位和幅度谱_源码.zip
2021-10-18 23:15:48求图像的相位和幅度谱_幅度相位_求图像的相位和幅度谱_源码.zip -
频谱、幅度谱、功率谱和能量谱含义
2021-04-19 00:40:39在信号处理的学习中,有一些与谱有关的概念,如频谱、幅度谱、功率谱和能量谱等,常常让人很糊涂,搞不清其中的关系。这里主要从概念上厘清其间的区别。对一个时域信号进行傅里叶变换,就可以得到的信号的频谱,信号... -
C语言 使用FFT得到信号幅度谱
2019-06-06 19:24:02前面的一篇文章我们介绍了使用DFT得到信号的幅度谱的方法,现在我们来看一下FFT实现信号幅度谱。这里我们使用的FFT源程序是徐士良老师的C语言算法程序——快速傅里叶变换。另外,本文也会对DFT以及FFT实现信号幅度谱... -
短时幅度谱估计在语音增强中的研究和应用,matlab源码+16000字word论文稿
2022-04-24 18:05:29短时幅度谱估计在语音增强中的研究和应用,matlab源码+word论文稿 基于短时幅度谱估计来研究语音增强,主要介绍了功率谱相减、维纳滤波法,并介绍了这几种语音增强方法的基本原理和实现方法。通过研究,我们得到在白... -
【20211214】【信号处理】使用Matlab求解信号的频谱图、幅度谱、相位谱
2021-12-14 16:16:05但除以傅里叶变换点数 N 之后的幅度谱三个尖峰幅值 = 原信号幅值的一半(这一点我还不是特别明白为什么要除以 N,为什么为原信号幅值的一半,有可能得到的是双边谱,如果只显示正频部分,乘以 2 之后就和原信号幅值... -
短时幅度谱估计在语音增强中的研究和应用
2020-09-28 15:36:52本论文基于短时幅度谱估计来研究语音增强,主要介绍了功率谱相减、维纳滤波法,并介绍了这几种语音增强方法的基本原理和实现方法。通过研究,我们得到在白噪声的条件下,这些语音增强方法具有很好的增强效果,可... -
图像的幅度谱与相位谱
2020-07-17 23:42:53图像幅度谱与相位谱的代码演示,本例使用泰勒斯威夫特的图像作为图像素材。代码如下所示: #include<iostream> #include<opencv2/opencv.hpp> #include<math.h> using namespace std; using ... -
图像傅里叶变换的幅度谱、相位谱以及双谱重构原图像
2020-12-09 22:52:31简单的求取下灰度图像的幅度谱和相位谱并进行双谱重构:直接上代码:clear allPicture = imread('E:\others\Picture\Library.jpg');Picture_Gray = rgb2gray(Picture);%灰度处理Picture_FFT = fft2(Picture_Gray);%... -
如何得到信号的幅度谱和相位谱
2020-06-14 11:20:42如何得到信号的幅度谱和相位谱 1 奈奎斯特采样率 2 fftshift说明 3 频谱图的横坐标如何和真实的频率对应 4 频谱图的纵坐标如何和真实的幅度值对应 5 源代码 6 仿真结果 1 奈奎斯特采样率 如果想要不失真的恢复原基带...