Ich habe eine Funktion für die Sound-Verarbeitung/Sound-Verarbeitung. Und vorher war alles ein einziger Kanal. Aber weißt du, ich mache es mehr oder weniger mehrkanalig. An diesem Punkt habe ich das Gefühl, ich mache einen Teil der Scripts immer und immer wieder.Wiederholung von Tests in mehreren Funktionen python
In diesem Beispiel sind es zwei Funktionen (meine ursprüngliche Funktion ist länger), aber das gleiche passiert auch in einzelnen Skripten.
my Two functions
import numpy as np
# def FFT(x, fs, *args, **kwargs):
def FFT(x, fs, output='complex'):
from scipy.fftpack import fft, fftfreq
N = len(x)
X = fft(x)/N
if output is 'complex':
F = np.linspace(0, N)/(N/fs)
return(F, X, [])
elif output is 'ReIm':
F = np.linspace(0, N)/(N/fs)
RE = np.real(X)
IM = np.imag(X)
return(F, RE, IM)
elif output is 'AmPh0':
F = np.linspace(0, (N-1)/2, N/2)
F = F/(N/fs)
# N should be int becouse of nfft
half_spec = np.int(N/2)
AMP = abs(X[0:half_spec])
PHI = np.arctan(np.real(X[0:half_spec])/np.imag(X[0:half_spec]))
return(F, AMP, PHI)
elif output is 'AmPh':
half_spec = np.int(N/2)
F = np.linspace(1, (N-1)/2, N/2 - 1)
F = F/(N/fs)
AMP = abs(X[1:half_spec])
PHI = np.arctan(np.real(X[1:half_spec])/np.imag(X[1:half_spec]))
return(F, AMP, PHI)
def mFFT(x, fs, spectrum='complex'):
fft_shape = np.shape(x)
if len(fft_shape) == 1:
mF, mX1, mX2 = FFT(x, fs, spectrum)
elif len(fft_shape) == 2:
if fft_shape[0] < fft_shape[1]:
pass
elif fft_shape[0] > fft_shape[1]:
x = x.T
fft_shape = np.shape(x)
mF = mX1 = mX2 = []
for channel in range(fft_shape[0]):
si_mF, si_mX1, si_mX2 = FFT(x[channel], fs, spectrum)
if channel == 0:
mF = np.append(mF, si_mF)
mX1 = np.append(mX1, si_mX1)
mX2 = np.append(mX2, si_mX2)
else:
mF = np.vstack((mF, si_mF))
mX1 = np.vstack((mX1, si_mX1))
if si_mX2 == []:
pass
else:
mX2 = np.vstack((mX2, si_mX2))
elif len(fft_shape) > 2:
raise ValueError("Shape of input can't be greather than 2")
return(mF, mX1, mX2)
Die zweite Funktion in diesem Fall hat das Problem.
Der Grund für diese Überprüfungen ist am besten mit einem Beispiel zu verstehen:
Ich habe eine Probe von 1 Sekunde Audiodaten mit 4 Mikrofonen aufgenommen. so habe ich ein ndim-Array von 4 x 44100 Proben. Die FFT funktioniert auf jedem geradzahligen Array. Das bedeutet, dass ich in beiden Situationen ein Ergebnis erhalte (4 x 44100 und 44100 x 4).
Für alle Funktionen nach dieser Funktion habe ich auch 2 Datentypen. oder ein komplexes Signal oder ein Tupel von zwei Signalen (Amplitude und Phase) ... was ist ein zusätzlicher Schalter/Check in das Skript.
- Check-Typ (Tupel oder komplexe Daten)
- Kontrollrichtung (ad es ändern)
- überprüfen Größe/Form
- Lauf-Funktion und fügen/stapeln diese
gibt es einige Methoden, um dies weniger repeat ich habe diese Situation in mindestens 10 Funktionen ...
Ich füge ein Beispiel in meine Frage, warum ich denke, dass Sie Beispiel nicht arbeiten. Es war zu viel, um es in einem Kommentar zu erklären. –
Hallo, ich habe meine Antwort geändert, um einen weiteren Vorschlag aufzunehmen, der vielleicht besser an das angepasst ist, was Sie wollen –