liangd123654 发表于 2014-11-2 10:19:11

在数字信号处理里面如何完成这个信号的重构?

本帖最后由 liangd123654 于 2014-11-2 13:03 编辑

在数字信号处理里面如何完成这个信号的重构?
如题。

问题补充:

已知的就只有采样率FS,序列长度N,还有就是原始信号序列。信号各个频率成分的幅频相信息均不已知。

先假设只有2个频率成分。

图片中的问题描述不全面,如有误导,抱歉抱歉。

hongh 发表于 2014-11-2 12:09:17

FFT 后取共轭 ,是得到什么?

需要FFT后求出 两个相位值吧

asma 发表于 2014-11-2 12:38:02

你这里边哪几个参数是已知的

liangd123654 发表于 2014-11-2 12:55:30

hongh 发表于 2014-11-2 12:09
FFT 后取共轭 ,是得到什么?

需要FFT后求出 两个相位值吧

对原始信号FFT的结果取共轭得到一个新的序列。再对这个序列进行IFFT。

liangd123654 发表于 2014-11-2 12:56:33

asma 发表于 2014-11-2 12:38
你这里边哪几个参数是已知的

已知的有:
FS
N
还有就是长度为N的原始信号序列。

MATLAB程序里有。

hongh 发表于 2014-11-2 13:23:01

liangd123654 发表于 2014-11-2 12:55
对原始信号FFT的结果取共轭得到一个新的序列。再对这个序列进行IFFT。

我 的意思 是不明白 ,做共轭的意义。

again 发表于 2014-11-2 13:51:39

只要保证采样不发生混叠就很容易处理,现在频谱泄露校正算法还是很精确的可以翻下我以前发的算法

liangd123654 发表于 2014-11-2 20:30:09

again 发表于 2014-11-2 13:51
只要保证采样不发生混叠就很容易处理,现在频谱泄露校正算法还是很精确的可以翻下我以前发的算法 ...

你好。
绝对不会发生混叠。
翻了你的3页的帖子,没有发现。 能不能针对我的这个问题提供一些具体的方法呢?

liangd123654 发表于 2014-11-2 20:36:57

hongh 发表于 2014-11-2 13:23
我 的意思 是不明白 ,做共轭的意义。

一个余弦信号的相位如果变为原来的相反数,傅里叶变换的结果就会是原来的共轭。

MATLAB程序里面可以看到:f1(400Hz)、f2(1200Hz)都正好在FFT的频点上时,IFFT的结果就是要重建的信号。

但是当信号的频率不是40Hz的整倍数时,这种方法就失效了。

again 发表于 2014-11-2 21:37:05

clear all;clc
N=256;
fs=1000;
f=51.1234;
a=1.2345;
ph=30.123;
dc=0.123;
t=0:N-1;
x=a*sin(2*pi*f*t/fs+ph*pi/180)+dc;
xfft=fft(x,N);
y=abs(xfft);
=max(y(2:N/2));
k=k+1;
z1=xfft(k)-(xfft(k-1)+xfft(k+1))/2;
z2=xfft(k+1)-(xfft(k)+xfft(k+2))/2;
ka=abs(z1)/abs(z2);
r=(2-ka)/(1+ka)
fo=(k-1+r)*fs/N
ao=2*pi*r*(1-r*r)*(abs(z1))/(N*sin(r*pi))
pho=(angle(z1)-pi*r)*180/pi+90

MATLAB输出结果,精度自己看
fo =

51.123401059088216


ao =

   1.234499850166726


pho =

30.122670622875049
这个是单频信号,多频的话这个三点校正算法频率间隔需要5个以上才比较好,你可以去看看频谱泄漏校正算法相关数据,丁康老师、王兆华老师推荐可以看

again 发表于 2014-11-2 21:49:52

本帖最后由 again 于 2014-11-2 21:51 编辑

两个频率的你看下
clear all;clc
N=256;
fs=1000;
f=51.1234;
a=1.2345;
ph=30.123;
dc=0.123;
f2=123.4567;
a2=0.54321;
ph2=9.87654;
t=0:N-1;
x=a*sin(2*pi*f*t/fs+ph*pi/180)+dc;
x=x+a2*sin(2*pi*f2*t/fs+ph2*pi/180);
xfft=fft(x,N);
y=abs(xfft);
=max(y(2:N/2));
k=k+1;
z1=xfft(k)-(xfft(k-1)+xfft(k+1))/2;
z2=xfft(k+1)-(xfft(k)+xfft(k+2))/2;
ka=abs(z1)/abs(z2);
r=(2-ka)/(1+ka)
fo=(k-1+r)*fs/N
ao=2*pi*r*(1-r*r)*(abs(z1))/(N*sin(r*pi))
pho=(angle(z1)-pi*r)*180/pi+90
y(k-2)=0;
y(k-1)=0;
y(k)=0;
y(k+1)=0;
y(k+2)=0;
=max(y(2:N/2));
k=k+1;
z1=xfft(k)-(xfft(k-1)+xfft(k+1))/2;
z2=xfft(k+1)-(xfft(k)+xfft(k+2))/2;
ka=abs(z1)/abs(z2);
r=(2-ka)/(1+ka)
fo2=(k-1+r)*fs/N
ao2=2*pi*r*(1-r*r)*(abs(z1))/(N*sin(r*pi))
pho2=(angle(z1)-pi*r)*180/pi+90

输出
r =

   0.087606333308264


fo =

51.123462239485406


ao =

   1.234492722429198


pho =

30.118693364380803


r =

-0.395071379304881


fo2 =

   1.234567524245903e+02


ao2 =

   0.543202651514619


pho2 =

   9.875865191205620

opiviqo 发表于 2014-11-2 21:59:11

坛里的高手真多啊!~~~

liangd123654 发表于 2014-11-2 23:28:12

again 发表于 2014-11-2 21:49
两个频率的你看下
clear all;clc
N=256;


多谢提供代码。
两个我都看了,思路就是

首先进行信号频率估计,利用了频谱幅度信息提高了估计精度。
然后就得到对应的频率的幅相信息。
最后可以解决我的问题实现信号的重构。

然而问题在于这种方法虽然提高了频率估计精度,但是由于始终是基于FFT,频率分辨率依然没有提高。

也就是说双频的时候,对于第二个程序,当|f2-f|<fs/N 的时候两个频率估计都不准。

如果说的不对,还请指正。

使用fft等频率估计的方法始终受制于估计频率分辨率。所以我现在就想,能不能舍弃频率估计的思路,不用知道精确的频率,只是获得重构的信号。

hongh 发表于 2014-11-3 16:54:01

liangd123654 发表于 2014-11-2 20:36
一个余弦信号的相位如果变为原来的相反数,傅里叶变换的结果就会是原来的共轭。

MATLAB程序里面可以看到 ...

取共轭,是时域中相位 变成相反数 ,还是相位差90 , 我记错了?

liangd123654 发表于 2014-11-3 22:30:49

hongh 发表于 2014-11-3 16:54
取共轭,是时域中相位 变成相反数 ,还是相位差90 , 我记错了?

你下载我发的那个程序 改改信号试一下就知道了。
页: [1]
查看完整版本: 在数字信号处理里面如何完成这个信号的重构?