2017-11-08 2 views
0

Ich arbeite im Bereich der Biosignal-Akquisition. Ich habe ein Experiment wie unten beschrieben durchgeführt und versuche nun, einige Ergebnisse aus den Daten zu erhalten.Matlab: Berechnung Signal-Rausch-Verhältnis (SNR) von zwei hochkorrelierten Zeit-Domain-Signale

Ich habe eine Textdatei eines Signals in Matlab. Ich habe das Signal auf einen Wellenformgenerator geladen und dann den Generatorausgang auf einem Oszilloskop aufgezeichnet. Ich habe das aufgenommene Signal vom Oszilloskop zurück in Matlab importiert. Der Pearson-Korrelationskoeffizient zwischen dem Originalsignal und dem Oszilloskopsignal beträgt 0,9958 (erhalten mit der Corrcoeff-Funktion).

Ich möchte das SNR des Oszilloskopsignals berechnen (was ich mein Signal nenne und welches Rauschen durch die Digital-zu-Analog-Umwandlung eingeführt wird und umgekehrt). Ich habe ein Snippet der 2 Signale als Referenz beigefügt.

Also mein Original-Signal ist X und Oszilloskop-Signal ist X + N. Ich habe die SNR-Funktion verwendet, um SNR wie folgt zu berechnen.

Das Ergebnis war 20,44 dB. Dies scheint mir, wie ich mit einer so hohen Korrelation gedacht hätte, dass das SNR viel höher sein sollte?

Oder ist es nicht angemessen zu versuchen, SNR in einer solchen Situation zu berechnen?

Alle Hilfe ist willkommen.

Dank

enter image description here

Edit: Graph von ein paar Ergebnisse vs Sleutheye simulierte Beziehung

enter image description here

Antwort

1

Sie könnten, wie auch solche moderate SNR noch überrascht sein kann führen zu ziemlich hohen Korrelationen.

Ich führte ein Experiment durch, um die ungefähre Beziehung zwischen Korrelation und Signal-Rausch-Verhältnis Schätzung zu veranschaulichen. Da ich Ihr spezifisches EEG-Signal nicht hatte, habe ich nur ein konstantes Referenzsignal und etwas weißes Gaußsches Rauschen verwendet. Denken Sie daran, dass die Beziehung durch die Art des Signals und des Rauschens beeinflusst werden könnte, aber es sollte Ihnen eine Vorstellung davon geben, was Sie erwarten können. Diese Simulation kann mit dem folgenden Code ausgeführt werden:

SNR = [10:1:40]; 

M = 10000; 
C = zeros(size(SNR)); 
for i=1:length(SNR) 

    x = ones(1,M); 
    K = sqrt(sum(x.*x)/M)*power(10, -SNR(i)/20); 
    z = x + K*randn(size(x)); 
    C(i) = xcorr(x,z,0)./sqrt(sum(x.*x)*sum(z.*z)); 
end 

figure(1); 
hold off; plot(SNR, C); 
corr0 = 0.9958; 
hold on; plot([SNR(1) SNR(end)], [corr0 corr0], 'k:'); 
snr0 = 20.44; 
hold on; plot([snr0 snr0], [min(C) max(C)], 'r:'); 

xlabel('SNR (dB)'); 
ylabel('Correlation'); 

Die gestrichelte schwarze horizontale Linie unterstreicht Ihre 0,9958 Korrelationsmessung und die gestrichelte rote vertikale Linie unterstreicht Ihr 20,44 dB SNR Ergebnis.

enter image description here

würde ich sagen, dass ein ziemlich gutes Spiel ist!

In der Tat, für diesen speziellen Fall in meiner Simulation (x = 1; z = x + N(0,σ)), wenn wir C(x,z) bezeichnen die Korrelation zwischen x und z und σ als Rauschstandardabweichung zu sein, können wir tatsächlich zeigen, dass:

      enter image description here

ein Korrelationswert von 0,9958 gegeben, wäre dies ein SNR von 20.79dB, ergeben, die mit den Ergebnissen konsistent ist.

+0

Das ist eine großartige Antwort, danke. Ich habe meinen Korrelationswert mit 'corrcoef' anstelle von' xcorr' erhalten. Habe ich richtig gedacht, dass 'xcorr' in der Art ' C (i) = xcorr (x, z, 0) ./ sqrt (Summe (x. * X) * Summe (z. * Z)); ' im wesentlichen das gleiche ist, wie Sie die Berechnung: ' Kovarianz (x, z)/sqrt (Varianz (x) * Varianz (z)) ' , die gibt immer einen Wert zwischen +/- 1 , das ist das gleiche wie Pearson? Auch ich verstehe Ihren endgültigen Fall nicht vollständig. Ich habe die Formel nicht gesehen (Korrelation^2/(1-Korrelation^2)) = Rauschstandardabweichung vor? Nochmals vielen Dank – markos14

+0

Auch eine triviale Frage, aber warum gibt es ein Minus in Ihrer dB/Betrag Berechnungen, sowohl im Matlab-Code ('-SNR (i)') und der letzte Fall (der sich auf die letzte bezieht Teil meines vorherigen Kommentars). – markos14

+1

1) mit 'corrcoef' vs' xcorr': sie sind nicht gleichwertig. 'xcorr (x, z, 0)' berechnet 'sum (x. * z)' was nicht dasselbe ist wie 'cov (x, z) = Summe ((x-mean (x)). * (z-mean (z)). "Auch Pearsons Korrelation ist nicht definiert 2) Die Formel ist spezifisch für das Signal beteiligt. Es ist eine Ableitung beteiligt (z. B. E {Summe (x. * X)} = M, E {Summe (z. * Z)} = M (1 + σ^2), ...) 3) Der Code verwendet ein negatives Vorzeichen (für dB/mag), weil es die Stärke des Rauschens relativ zu einem Signal einheitlicher Größe berechnet. Wenn ich ein Rauschen mit einheitlicher Amplitude verwendet hätte und stattdessen das Signal skaliert hätte, wäre das ein positives Zeichen. – SleuthEye

Verwandte Themen