[已答复] Matlab的hanning窗调制周期信号

[复制链接]
wudikk 发表于 2009-7-29 21:46:02
大家好。今天我做了个10周期的70KHz的hanning窗调制信号。时域波形我画出来了。但是做傅立叶变换时得到的频谱图却有两个频率成分。且都不是70KHz的中心频率。程序如下:
>> t=0:0.0000001:0.00015;
>> fc=70000;
>> n=10;
>> y=0.5*(1-cos(2*pi*fc*t/n)).*sin(2*pi*fc*t);
>> subplot(211);
>> plot(t,y);
>> axis([0 0.00015 -1 1 ]);
>> grid;
>> x=fft(y);
>> x=fftshift(x);
>> subplot(212);
>> plot(abs(x));

其中fc是设置中心频率。n是信号的单音频周期数。其实y信号就是一个hanning窗信号和一个正弦信号的乘积。得出的信号如图所示。
untitled.jpg
做频谱分析本该得到如下的图
222.jpg
但是我却得到了下面的两个频带。。
大幅度.jpg
请问各位高手是怎么回事呢?我是才接触MATLAB.不太懂。请各位高手帮我解决下。



34 条回复


songzy41 发表于 2009-7-30 09:07:49
原帖由 wudikk 于 2009-7-29 21:46 发表
大家好。今天我做了个10周期的70KHz的hanning窗调制信号。时域波形我画出来了。但是做傅立叶变换时得到的频谱图却有两个频率成分。且都不是70KHz的中心频率。程序如下:
>> t=0:0.0000001:0.00015;
>> fc=70000;
>> n= ...

LZ的程序中把正负频率都画了,所以出了双线。把程序修改如下
dt=0.0000001; fs=1/dt;
t=0:dt:0.00015;
fc=70000;
n=10;
y=0.5*(1-cos(2*pi*fc*t/n)).*sin(2*pi*fc*t);
subplot(211);
plot(t,y);
axis([0 0.00015 -1 1 ]);
grid;
N=8192;
df=fs/N;
n=1:N; n2=1:N/2+1;
ff=(n2-1)*df;
x=fft(y,N);
%x=fftshift(x);
subplot(212);
plot(ff,abs(x(n2)));
xlim([0 100000]); grid;
得图有:
wd1a.jpg

wudikk 发表于 2009-7-30 11:25:57
多谢songzy41的帮助,,问题是解决了。。但是出于学以致用的考虑,我还是想具体弄明白。这一段:
N=8192;
df=fs/N;
n=1:N; n2=1:N/2+1;
ff=(n2-1)*df;
x=fft(y,N);
%x=fftshift(x);
subplot(212);
plot(ff,abs(x(n2)));
中,N长度怎么取?我看很多例子N=128啊什么的。还有,n=1:N是什么?因为之前已经定义了一个n。
还有关键的ff=(0:N/2)*fs/N是什么意思?为什么后面的不是整个abs(x)的长度,而是x(n2)呢?
我是才接触Matlab这方面的哈。虽然很多例子都是这么用的,但是就是没解释明白,不知道为什么这样用。希望能帮我解释清楚下,这样以后才能用得明白。谢谢了哈。。。

songzy41 发表于 2009-7-30 14:31:32
原帖由 wudikk 于 2009-7-30 11:25 发表
但是出于学以致用的考虑,我还是想具体弄明白。这一段:
N=8192;
df=fs/N;
n=1:N; n2=1:N/2+1;
ff=(n2-1)*df;
x=fft(y,N);
%x=fftshift(x);
subplot(212);
plot(ff,abs(x(n2)));
中,N长度怎么取?我看很多例子N=128啊什么的。还有,n=1:N是什么?因为之前已经定义了一个n。
还有关键的ff=(0:N/2)*fs/N是什么意思?为什么后面的不是整个abs(x)的长度,而是x(n2)呢?
我是才接触Matlab这方面的哈。虽然很多例子都是这么用的,但是就是没解释明白,不知道为什么这样用。希望能帮我解释清楚下,这样以后才能用得明白。

1,N长度怎么取?这取决于分辨率。按LZ的设置,采样频率fs=1e7,信号长度为1501个点,这样直接fft(y),在频域分辨率为df=fs/1501=6662.2,信号的频谱在60000-80000之间有个峰值,得到如下的图,可看出虽有峰值,但曲线不很光滑,所以在FFT时增大N,通过补零的方法使频谱的谱线内插,得到光滑的曲线。如果FFT时LZ把N变小,曲线不仅更明显变为折线,峰值也为逐步消失。
N怎么取法完全由实际情况来决定。
2,n=1:N可以不要;n2=1:N/2+1;是设置显示谱线的范围。在实序列FFT后频谱是共轭对称的,只需要显示正频率的部分,正频率的区间即在n2=1:N/2+1之间,所以显示幅值谱用abs(x(n2))。频率分辨率(谱线之间的频率间隔)为df=fs/N,正频率部分对应的频率为ff=(n2-1)*df。
wd11a.jpg

wudikk 发表于 2009-7-30 15:32:04
呵呵。。。很详细很明白啊。。豁然开朗。学到不少。。终于知道是怎么回事了。。。。。太谢谢你啦。。。:handshake :)

小小鱼@ 发表于 2015-1-7 08:13:06
受益匪浅,,,

@fengrui@ 发表于 2015-11-23 22:11:57
:o:ojiangdehao

木易早早 发表于 2018-3-14 10:23:04
xiexie 楼主,谢谢讲题人

1092834076 发表于 2020-5-12 13:28:33
songzy41 发表于 2009-7-30 14:31
1,N长度怎么取?这取决于分辨率。按LZ的设置,采样频率fs=1e7,信号长度为1501个点,这样直接fft(y),在 ...

您好,我冒昧问一句,LZ的采样频率是1e7是怎么看出来的,我初学,望您指教。还有信号长度为1501个点和N是8192怎么得出来的,我思考了很久,没想出来,望赐教。

songzy41 发表于 2020-5-12 15:35:49
1092834076 发表于 2020-5-12 13:28
您好,我冒昧问一句,LZ的采样频率是1e7是怎么看出来的,我初学,望您指教。还有信号长度为1501个点和N是 ...

1,采样频率1e7不是看出来的。请看第1层LZ的第1条语句:
>> t=0:0.0000001:0.00015;
其中包含了dt=0.0000001,而fs=1/dt=1e7,就是这样计算出来的。
2,同样语句t=0:0.0000001:0.00015;,给出 t为1501个战马,所以信号长度只有1501个点。
3,在第4层就用1501个点做FFT,得到的图中可没有看到峰值,这为什么,因为峰值在两个点之间,说明频域分辨率太低。在已知有限长数据时要增加频率分辨率最简单的方法是在做FFT时,数据后面补零:
x=fft(y,N);
这N是大于1501,可以2048、4096、8192、16384等等,或其他大于1501的数值。x=fft(y,N);这语句表示数据长1501(数据序列y的长度)后补了N-1501个0值,然后把这个补了0值的数据序列进行FFT变换。
首先是要提高频域分辨率序列做FFT必须要补0;又我选择8192完全是巧合。


1092834076 发表于 2020-5-13 10:03:15
songzy41 发表于 2020-5-12 15:35
1,采样频率1e7不是看出来的。请看第1层LZ的第1条语句:
>> t=0:0.0000001:0.00015;
其中包含了dt=0.0000 ...

谢谢详细解答,我还有个问题没搞明白,周期10的话反应在图上的话,体现在哪里。

songzy41 发表于 2020-5-13 15:40:52
1092834076 发表于 2020-5-13 10:03
谢谢详细解答,我还有个问题没搞明白,周期10的话反应在图上的话,体现在哪里。 ...

原LZ的问题中并没有说信号的周期为10,而是说用10个周期的正弦信号,见第1层原文:
今天我做了个10周期的70KHz的hanning窗调制信号。
老实说,LZ也没有严格的10周期的70KHz的信号,而是10个周期多一些。我们来看一下LZ的信号是:
>> t=0:0.0000001:0.00015;
>> fc=70000;
>> n=10;
>> y=0.5*(1-cos(2*pi*fc*t/n)).*sin(2*pi*fc*t);
信号由两部分组成:70KHz的正弦信号为sin(2*pi*fc*t);hanning窗调制信号0.5*(1-cos(2*pi*fc*t/n))
而 t=0:0.0000001:0.00015。这信号两部分的波形图下图所示,可以看出正弦信号有10.5个周期。
wd01c.jpg

1092834076 发表于 2020-5-20 16:25:54
songzy41 发表于 2020-5-13 15:40
原LZ的问题中并没有说信号的周期为10,而是说用10个周期的正弦信号,见第1层原文:
今天我做了个10周期的 ...

谢谢解答

2018030066 发表于 2020-10-15 00:47:28
songzy41 发表于 2020-5-12 15:35
1,采样频率1e7不是看出来的。请看第1层LZ的第1条语句:
>> t=0:0.0000001:0.00015;
其中包含了dt=0.0000 ...

您好,请问一下,当fc的值变大之后,比如说取100khz,为什么频谱图会出现多个峰值,怎么才能出现位移峰值,谢谢啦。

程序

程序

频谱图

频谱图

songzy41 发表于 2020-10-16 11:11:26
2018030066 发表于 2020-10-15 00:47
您好,请问一下,当fc的值变大之后,比如说取100khz,为什么频谱图会出现多个峰值,怎么才能出现位移峰值 ...

在12层中的信号:
y=0.5*(1-cos(2*pi*fc*t/n)).*sin(2*pi*fc*t);
由两部分组成:70KHz的正弦信号为sin(2*pi*fc*t);调制信号0.5*(1-cos(2*pi*fc*t/n)),而调制信号在t=0:0.0000001:0.00015的区间中正好接近于hanning窗,所以有以上的讨论。现在你提出的情况发生了变化,fc=100kHz,此时调制信号0.5*(1-cos(2*pi*fc*t/n))再也构不成hanning窗了,而是一个典型的余弦型幅值调制信号,所以它的频谱也是幅值调制信号的频谱,所以你给出的频谱图就是幅值调制信号的频谱。

2018030066 发表于 2020-10-20 14:48:15
songzy41 发表于 2020-10-16 11:11
在12层中的信号:
y=0.5*(1-cos(2*pi*fc*t/n)).*sin(2*pi*fc*t);
由两部分组成:70KHz的正弦信号为sin(2* ...

感谢您的耐心解答

锤爆你羊头 发表于 2021-12-27 20:20:42
songzy41 发表于 2020-10-16 11:11
在12层中的信号:
y=0.5*(1-cos(2*pi*fc*t/n)).*sin(2*pi*fc*t);
由两部分组成:70KHz的正弦信号为sin(2* ...

您好我是初学者我想问下这个函数
s=1000;        

n=20;           

f=240000;   

x=0:(n/(f*s)):(n/f);

for i=1:length(x)

y(i)=sin(2*pi*f*x(i))*(0.5-0.5*cos(2*pi*f*x(i)/n));

end

x=x';

y=y';

x(:,2)=y;

xlswrite('1.xls',x);
是老师给我的资料 我想问下如果我想改变频率 其它参数应该如何变化呢

songzy41 发表于 2021-12-28 18:23:42
锤爆你羊头 发表于 2021-12-27 20:20
您好我是初学者我想问下这个函数
s=1000;        

你的信号两部分分别为
y1=sin(2*pi*f*x);
y2=(0.5-0.5*cos(2*pi*f*x/n));

y=y1.*y2;
你可以仔细分析一下,可以发现y1和y2都是和f无关,所以你不管是f增大或减小,y1和y2,以及y都没有变化。
所以你可以改变频,其他什么也不要变,得到一样的结果

锤爆你羊头 发表于 2022-5-7 19:59:18
songzy41 发表于 2021-12-28 18:23
你的信号两部分分别为
y1=sin(2*pi*f*x);
y2=(0.5-0.5*cos(2*pi*f*x/n));

谢谢宋老师解答 还想问下那只是改变频率就好了吗 比如我想换成300khz的信号是否只需要将f改为300000,s和n老师给的资料是信号采样点数和信号调制周期数,请问宋老师这两个需要更改吗,这两个参数和信号频率f又有怎样的关系呢

songzy41 发表于 2022-5-10 20:57:42
锤爆你羊头 发表于 2022-5-7 19:59
谢谢宋老师解答 还想问下那只是改变频率就好了吗 比如我想换成300khz的信号是否只需要将f改为300000,s和 ...

你好,笫一层的窗函数设置得并不是很好。我认为你要用 于300khz没有问题,只要采样频率满足采样定理,例如用1e7Hz。vduo金字塔看i哦没他咋啦一下。设数据长度为M,
m=0:M-1;
x=m/fs;
y1=sin(2*pi*f*x);
y2=(0.5-0.5*cos(2*pi*m/M));

锤爆你羊头 发表于 2022-5-11 10:07:28
songzy41 发表于 2022-5-10 20:57
你好,笫一层的窗函数设置得并不是很好。我认为你要用 于300khz没有问题,只要采样频率满足采样定理,例 ...

好的谢谢宋老师 我用的采样频率就是10MHZ,请问是可以用于大多数频率吗 比如后续还想用150KHZ进行仿真,按照您的建议我修改了一下麻烦您再帮我看看有没有理解对,这个数据长度M应该就是之前的采样点数s吧,但是好像信号调制周期数n这个参数不知道放在哪

M=1000;        
            

f=240000;   

m=0:M-1;;

x=m/fs;
for i=1:length(x)

y1=sin(2*pi*f*x);
y2=(0.5-0.5*cos(2*pi*m/M));
end

x=x';

y=y';

x(:,2)=y;

xlswrite('1.xls',x);

songzy41 发表于 2022-5-11 20:17:13
锤爆你羊头 发表于 2022-5-11 10:07
好的谢谢宋老师 我用的采样频率就是10MHZ,请问是可以用于大多数频率吗 比如后续还想用150KHZ进行仿真, ...

看来你对于MATLAB还是不很熟悉,例如
for i=1:length(x)
y1=sin(2*pi*f*x);
y2=(0.5-0.5*cos(2*pi*m/M));
end
求y1和y2完全不要用for-end循环来完成,程序中还缺计算y。你需要信号调制周期数n,而且我们知道在相同采样频率下,不同的信号频率,n个周期的长度各不相同。我现编程序如下:
f=240000;   
fs=1e7;
Ts=ceil(fs/f);
n=10;
M=Ts*n;

m=0:M-1;
x=m/fs;
%for i=1:length(x)
y1=sin(2*pi*f*x);
y2=(0.5-0.5*cos(2*pi*m/M));
%end
y=y1.*y2;

subplot 311; plot(x,y1)
subplot 312; plot(x,y2)
subplot 313; plot(x,y)

x=x';
y=y';
x(:,2)=y;
xlswrite('1.xls',x);



锤爆你羊头 发表于 2022-5-13 10:04:08
songzy41 发表于 2022-5-11 20:17
看来你对于MATLAB还是不很熟悉,例如
for i=1:length(x)
y1=sin(2*pi*f*x);

是的老师我确实对matlab不熟悉 没人指导很难理解代码里的一些含义 谢谢老师指导 我再下去理解下您编的程序 如果后面对某个地方不懂还想请教您 希望您能解答 麻烦您了

锤爆你羊头 发表于 2022-5-13 10:10:20
锤爆你羊头 发表于 2022-5-13 10:04
是的老师我确实对matlab不熟悉 没人指导很难理解代码里的一些含义 谢谢老师指导 我再下去理解下您编的程 ...

老师请问第三行是cell语句吗 subplot那里是否应该写成subplot(3,1,3)呢 最后还想请问您这个程序如果想换其它频率是不是只需要更改f的值 我看您在里面用到了fs=1e7我理解的应该是采样频率但是这个我在仿真软件里面也有设置请问是否会重复呢 感谢老师在百忙之中解答我的问题

锤爆你羊头 发表于 2022-5-13 10:11:34
songzy41 发表于 2022-5-11 20:17
看来你对于MATLAB还是不很熟悉,例如
for i=1:length(x)
y1=sin(2*pi*f*x);


老师请问第三行是cell语句吗 subplot那里是否应该写成subplot(3,1,1)呢 最后还想请问您这个程序如果想换其它频率是不是只需要更改f的值 我看您在里面用到了fs=1e7我理解的应该是采样频率但是这个我在仿真软件里面也有设置请问是否会重复呢 感谢老师在百忙之中解答我的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表