WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Faltung von HRTF´s aus verschiedenen Winkeln

 

Schnecke

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2016, 12:44     Titel: Faltung von HRTF´s aus verschiedenen Winkeln
  Antworten mit Zitat      
Hallo Zusammen,

ich hab vor kurzem erste begonnen mich mit Matlab und der Programmierung von Signaltheorie zu beschäftigen. Nun möchte ich ein kleines Skript schreiben, welches HRTF´s aus verschiedenen Winkeln mit einem Stereo Wav faltet. Bisher sieht das ganze so aus:

Code:
[file,path] = uigetfile({'*.wav';},'input file');
name=fullfile(path,file);
[wav, fs] =audioread(name);

n = input('Geben Sie eine Zahl von 0-11 ein. 0 = 0°HRTF; 1 = 25°HRTF; 2 = 28° HRTF; 3 = 33°HRTF; 4 = 43°HRTF; 5. = 60°HRTF; 6. = 90°HRTF; 7. = -13°HRTF; 8. = -14°HRTF; 9. = -15°HRTF; 10. = -70°HRTF; 11. = -90°HRTF:  ');

switch n
    case 0
        Winkel = w0;
    case 1
        Winkel = wP25;
    case 2
        Winkel = wP28;
    case 3
        Winkel = wP33;
    case 4
        Winkel = wP43;
    case 5
        Winkel = wP60;
    case 6
        Winkel = wP90;
    case 7
        Winkel = wM13;
    case 8
        Winkel = wM14;
    case 9
        Winkel = wM15;
    case 10
        Winkel = wM70;
    case 11
        Winkel = wM90;
    otherwise
        warning('Falsche Eingabe')
end

wav = wav';
wavL = wav(1,:);
wavR = wav(2,:);

Winkel = fft(Winkel);
WinkelL = Winkel(1,:);
WinkelL(end+1:numel(wavL)) = 0;
WinkelR = Winkel(2,:);
WinkelR(end+1:numel(wavR)) = 0;

wavLF = fft(wavL);
wavRF = fft(wavR);

outLF = wavLF .* WinkelL;
outL = ifft(outLF);
outRF = wavLF .* WinkelR;
outR = ifft(outRF);
out = [outL;outR];

sound (abs(out), fs);

 


Als Referenz ob ich es richtig gemacht habe oder nicht hab ich Vergleichswav´s die ich mit Hilfe von WinMF (http://winmf.de/) erstellt hab. Hier hab ich die Signale im Frequenzbereich miteinander multipliziert und das Ergebnis entsprch meinen Erwartungen. Ich weiß allerdings nicht so recht was ich jetzt anders mache. Für Tips und Hilfen wäre ich sehr dankbar.

Grüße

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 12.03.2016, 13:39     Titel:
  Antworten mit Zitat      
Hallo,

bei eine Faltung im Frequenzraum muss vorher die Länge der Eingangsvektoren richtig angepasst werden. Ansonsten führt die Multiplikation zu einer zyklischen Faltung, welches das falsche Ergebnis ist. Folgende Funktion führt eine Faltung mittels fft durch. Das Ergebnis ist identisch zur Faltung im Zeitbereich mittels conv .

Code:

function output = FFT_Faltung(sig1, sig2)
% Die Funktion führt eine schnelle Faltung mittels FFT aus
% Input:
% sig1 = Messsignal
% sig2 = Filter-Impulsantwort
% Output:
% output = gefiltertes Messignal
%--------------------------------------------------------------------------

% kopieren der Eingangsvektoren
sig1 = double(sig1(:));
sig2 = double(sig2(:));

% Faltungssatz sig(m) * h(n) = output(m+n-1):
outlength = length(sig1)+length(sig2)-1;
% nächste Zweierpotenz für FFT
fftsize = 2^nextpow2(outlength);

% Messsignal
%mit Nullen auf fftsize auffüllen
sig1 = [sig1; zeros(fftsize-length(sig1),1)];
%Berechnung des Frequenzspektrums
sig1 = fft(sig1,fftsize);

% Filter - Impulsantwort
%mit Nullen auf fftsize auffüllen
sig2 = [sig2; zeros(fftsize-length(sig2),1)];
%Berechnung des Frequenzspektrums
sig2 = fft(sig2,fftsize);
 
% Faltung durch Multiplikation der Spektren
% Rücktransformation in den Zeitbereich
conv_raw = ifft(sig1.*sig2);

% Rückgabe Ergebnis
output = transpose(conv_raw(1:outlength));
 


Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
Schnecke

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2016, 14:57     Titel:
  Antworten mit Zitat      
Hallo DSP,

erstmal danke für die schnelle Antwort. Also wenn ich das jetzt richtig verstanden hab, dann liegt bei mir das Problem darin nicht die richtige größe des Eingangsignals zu haben. Das wird dann so gelöst, dass das Eingangsignal künstliche verlängert wird (mit Nullen aufgefüllt) bis man eine Zweierpotenz erreicht hat, richtig?

Gruß
Schnecke
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 12.03.2016, 16:10     Titel:
  Antworten mit Zitat      
Das hier ist entscheidend...

Code:
% Faltungssatz sig(m) * h(n) = output(m+n-1):


Es werden die Längen n und m beachtet und danach auf die nächste 2er Potenz erhöht, damit der fft Algorithmus schneller läuft.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.