2017-04-20 8 views
2

J'essaie de mettre en œuvre un changement de phase de domaine de fréquence mais il y a peu de points sur lesquels je ne suis pas sûr.Changement de phase de domaine de fréquence, amplitude, taille d'espoir et non-linéarité

1- Je peux obtenir une reconstruction parfaite à partir d'un signal sinusoïdal ou de balayage en utilisant une fenêtre de hanning avec une taille de houblon de 50%. Néanmoins, comment est-ce que je devrais normaliser mon résultat en utilisant une taille de houblon> 50%?

2- Lors du décalage de la phase des signaux basse fréquence (f < 100, taille de la fenêtre < 1024, fs = 44100) Je peux clairement voir une certaine non-linéarité dans mon résultat. Est-ce dû au fait que la taille de la fenêtre est trop courte pour les basses fréquences?

Merci beaucoup pour votre aide.

clear 
freq=500; 
fs=44100; 
endTime=0.02; 
t = 1/fs:1/fs:(endTime); 
f1=linspace(freq,freq,fs*endTime); 
x = sin(2*pi*f1.*t); 
targetLength=numel(x); 

L=1024; 
w=hanning(L); 
H=L*.50;% Hopsize of 50% 
N=1024; 

%match input length with window length 
x=[zeros(L,1);x';zeros(L+mod(length(x),H),1)]; 

pend=length(x)- L ; 
pin=0; 
count=1; 
X=zeros(N,1); 
buffer0pad= zeros(N,1); 
outBuffer0pad= zeros(L,1); 
y=zeros(length(x),1); 
delay=-.00001; 
df = fs/N; 
f= -fs/2:df:fs/2 - df; 

while pin<pend 

    buffer = x(pin+1:pin+L).*w; 

    %append zero padding in the middle 
    buffer0pad(1:(L)/2)=buffer((L)/2+1: L); 
    buffer0pad(N-(L)/2+1:N)=buffer(1:(L)/2); 

    X = fft(buffer0pad,N); 

    % Phase modification 
    X = abs(X).*exp(1i*(angle(X))-(1i*2*pi*f'*delay)); 

    outBuffer=real(ifft(X,N)); 

    % undo zero padding---------------------- 
    outBuffer0pad(1:L/2)=outBuffer(N-(L/2-1): N); 
    outBuffer0pad(L/2+1:L)=outBuffer(1:(L)/2); 

    %Overlap-add 
    y(pin+1:pin+L) = y(pin+1:pin+L) + outBuffer0pad; 

    pin=pin+H; 
    count=count+1; 
end 

%match output length with original input length 
output=y(L+1:numel(y)-(L+mod(targetLength,H))); 

figure(2) 
plot(t,x(L+1:numel(x)-(L+mod(targetLength,H)))) 
hold on 
plot(t,output) 
hold off 

Répondre

0

Tout ce qui est inférieur à 100 Hz comporte moins de deux cycles dans votre fenêtre FFT. Notez qu'une DFT ou FFT représente n'importe quelle forme d'onde, y compris une seule sinusoïde périodique non entière, en faisant éventuellement la somme de tout un groupe de sinusoïdes de fréquences très différentes. par exemple. beaucoup plus qu'un seul. C'est juste comment les maths fonctionnent. Pour une fenêtre von Hann contenant moins de 2 cycles, il s'agit souvent d'un groupe de fréquences presque complètement différentes (peut-être très loin en termes de pourcentage de votre basse fréquence). Le décalage de la phase de toutes ces fréquences complètement différentes peut ou non déplacer votre sinusoïde basse fréquence fenêtrée de la quantité désirée (en fonction de la différence de fréquence de votre signal d'entier-périodique).

Pour les basses fréquences aussi, le miroir conjugué complexe doit être décalé en sens inverse afin de représenter un résultat complètement réel. Donc, vous finissez par mélanger 2 changements de phase superposés et opposés, ce qui est encore une fois surtout un problème si le signal basse fréquence est loin d'être un entier périodique dans l'ouverture DFT. L'utilisation d'une fenêtre plus longue dans le temps et les échantillons permet d'intégrer plus de cycles d'une fréquence donnée (nécessitant ainsi une puissance moindre de sinusoïdes de fréquences très différentes pour se résumer afin de composer, reconstituer ou synthétiser vos basses fréquences). sinusoïde de fréquence); et le conjugué complexe est plus éloigné en termes d'index bin FFT, réduisant ainsi les interférences.

Une séquence utilisant n'importe quel saut d'une fenêtre de von Hann qui dans 50%/(un nombre entier) de longueur est non-lossy (sauf pour la toute première ou dernière fenêtre). Toutes les autres tailles de saut modulent ou détruisent l'information, et ne peuvent donc pas être normalisées par une constante pour la reconstruction.

+0

Merci beaucoup pour votre réponse. Dans une version précédente de mon code, je décalais les fréquences négatives dans la direction opposée mais cela créait des variations d'amplitude lorsque la modification de phase était appliquée. Je suis ensuite retourné à la version actuelle du code. Pourriez-vous préciser quelles sont les basses fréquences dans votre réponse? Pourquoi devrions-nous seulement déplacer les basses fréquences négatives dans la direction opposée? – papaya

+0

Si vous ne modifiez pas la phase de sorte que la matrice reste symétrique conjuguée, vous obtenez un résultat complexe. Est-ce que c'est ce que tu veux? – hotpaw2

+0

Oui, merci. Il semble fonctionner très bien. – papaya