matlab实验报告 编号为8

将此部分最终的程序和画出的图片粘贴在此处(先程序、后图片),程序要做好注释,程序可以采用截图的方式,不管是采取了何种方式,程序和图片要确保完整、清晰易辨。
3.1 Matlab控制流结构的应用(6分)
求e:e=1+1+1/2!+1/3!+… (1/n!<1.0e-8)
(提示:将2.1(2)改为用while语句控制精度的形式)

3.2对数据添加随机噪声并去噪 (12分)
1.每个人根据自己的序号在SeismicData3D.mat中选一条实际地震数据测线来处理,3维地震数据大小为:512x128x128,第一维代表每条地震道的采样点数,第二维代表每条地震测线有多少地震道,第三维代表有多少条地震测线。时间采样间隔dt假定为1ms。对你所处理的那条线添加指定信噪比水平的噪声,如果你的编号为10,你添加噪声时,噪声能量/信号能量(1/SNR) = 0.3 + 10/100;
2.对添加噪声后的数据做频域空间域去噪处理;
3.画出类似下图查验去噪结果。

(提示:将SeismicData3D.mat用load函数读入工作区赋给变量Data3D,取自己的序号对应的测线,如Data=Data3D(:,:,10),参考第五章P39对数据加指定信噪比水平的随机噪声, 然后参考Chapter05_02FXDenoising P13-14对数据去噪并画图,数据和FXDenoising.m在Provided文件夹中)

4.用代码在你的个人夹(如FinalReportxx_Name)下创建名为“DataOutput”的子文件夹;
5.将你所处理的那条线写入到DataOutput文件夹下,文件名为:“Inline_xx.bin”,格式为二进制、float型,xx为你的编号;
6.将加随机噪声后的你那条线写入到DataOutput文件夹下,文件名为:“Inlinenoise_xx.bin”文件,格式为二进制、float型;
7.将加随机噪声后的你那条线写入到DataOutput文件夹下,文件名为:“Inlinenoise_xx.txt”,格式为txt文件,xx为你的编号;
8.调用segymat-1.6代码包下的ReadSegy函数将line19410.sgy文件读入Workspace 工作区;
9.调用segymat-1.6代码包下的WriteSegy函数将读入的line19410.sgy文件完整地写到DataOutput文件夹下,文件名为“line_xx.sgy” ,xx为你的编号;即要掌握segy数据的读写;
10.删除你的个人文件夹下所有后缀为 .asv的文件
11.所有的数据读写均写到自己个人文件夹(如FinalReportxx_Name)下的子文件夹DataOutput内。
(提示:segymat-1.6代码包已在Provided中给出,line19410.sgy为SUN工作站的数据格式,读写如下
[Data,SegyTraceHeaders,SegyHeader]=ReadSegy(filename);
WriteSegy('datacube.segy',data,'dt',.004,'Inline3D',Inline,'Crossline3D',Crossline,'cdpX',X,'cdpY',Y);
第6小题调用WriteSegy函数写文件:
WriteSegy('.\DataOutput\line_xx.sgy ',data))

3.1

e = 1;  % 初始化 e 为 1
n = 1;  % 初始化 n 为 1
term = 1/n;  % 计算第一个项 1/1! = 1

while term >= 1.0e-8  % 当项大于等于 1.0e-8 时继续迭代
    n = n + 1;  % 更新 n
    term = term / n;  % 计算下一项
    e = e + term;  % 累加结果
end

disp(['e = ' num2str(e)]);  % 输出结果

还请提供一下 "SeismicData3D.mat" 文件

img


SeismicData3D.mat中的实际地震数据测线

img


3.2的第三小题图

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
3.1 Matlab控制流结构的应用

程序如下:

% 计算e的值,使用while循环
e = 1;
n=1;
n_factorial = 1;
while 1/n_factorial >= 1.0e-8
    n = n + 1;
    n_factorial = n_factorial * n;
    e = e + 1/n_factorial;
end
fprintf('e = %.8f\n', e);

3.2对数据添加随机噪声并去噪

程序如下:

% 读取数据
load('SeismicData3D.mat');
Data = Data3D(:,:,10); % 选择第10条数据

% 添加噪声
SNR = 10; % 信噪比
noise = randn(size(Data)); % 生成符合标准正态分布的噪声
noise = noise ./ norm(noise(:)) .* norm(Data(:)) ./ SNR;
DataNoisy = Data + noise;

% 频域去噪
DataDenoised = FXdenoising(DataNoisy);

% 画图
figure;
subplot(3,1,1);
imagesc(Data);
title('原始数据');
subplot(3,1,2);
imagesc(DataNoisy);
title('加噪声后数据');
subplot(3,1,3);
imagesc(DataDenoised);
title('去噪后数据');

% 写入文件
data_filename = ['./DataOutput/Inline_',num2str(10,'%02d'),'.bin'];
Data = permute(Data,[2,1]); % 调整数据的行列顺序
fid = fopen(data_filename,'wb');
fwrite(fid,Data,'float');
fclose(fid);

data_noisy_filename = ['./DataOutput/Inlinenoise_',num2str(10,'%02d'),'.bin'];
DataNoisy = permute(DataNoisy,[2,1]); % 调整数据的行列顺序
fid = fopen(data_noisy_filename,'wb');
fwrite(fid,DataNoisy,'float');
fclose(fid);

data_noisy_txt_filename = ['./DataOutput/Inlinenoise_',num2str(10,'%02d'),'.txt'];
dlmwrite(data_noisy_txt_filename,DataNoisy);

segy_filename = './line19410.sgy';
[Data,SegyTraceHeaders,SegyHeader] = ReadSegy(segy_filename);
data_filename_sgy = ['./DataOutput/line_',num2str(10,'%02d'),'.sgy'];
WriteSegy(data_filename_sgy,Data);

注意:由于在Matlab中处理的数组默认是按列存储的,而segy文件的格式是按行存储的,因此需要在数据写入文件之前对数据进行行列顺序的调整。同时,在写入segy文件时要注意文件头信息的正确性。
如果我的回答解决了您的问题,请采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^