def construct(self): params = FFT_Song.getSongFormula("jojoVoice2.wav", 0) np_params = np.array(params) freq = np.array([0] * 5000) # 取前5000个频率及其对应强度 amplitudes = np.array([0] * 5000) for i in range(5000): p = params[i] freq[i] = p[1] amplitudes[i] = p[2] y_max = FRAME_Y_RADIUS x_max = FRAME_WIDTH self.camera.set_frame_center((x_max / 2, 1, 0)) self.camera.set_frame_height(y_max * 2 + 4) self.camera.set_frame_width(x_max + 2) # max_freq = 5000 # max_amplitude = 500 axes = Axes( x_min=0, x_max=x_max + 0.5, y_min=-y_max - 0.5, y_max=y_max + 0.5, ) y_tex = TextMobject("相位") y_tex.set_x(0.5) y_tex.set_y(y_max) y_tex.scale(0.7) x_tex = TextMobject("频率") x_tex.set_x(x_max + 0.5) x_tex.set_y(0.5) x_tex.scale(0.7) title_tex = TextMobject("相位谱") title_tex.set_stroke(GREEN_C, 1) title_tex.scale(0.7) title_tex.set_x(x_max / 2) title_tex.set_y(y_max) g = VGroup(axes, y_tex, x_tex, title_tex) g.shift((0, 1, 0)) curve = VMobject() max_freq = max(freq) max_amplitude = max(amplitudes) curve.set_points_smoothly([ (freq[i] / max_freq * x_max, amplitudes[i] / max_amplitude * y_max / 2, 0) for i in range(len(freq)) ]) curve.set_stroke(GREEN_C, 0.6) curve.shift((0, 1, 0)) # self.add(g) self.play(ShowCreation(g)) self.play(ShowCreation(curve)) self.wait(2)
def construct(self): params = FFT_Song.getSongFormula("jojoVoice2.wav", 1) # fun = lambda x: sum([ # param[0] * np.sin(2 * PI *param[1]* x + param[2]/180*PI) # for param in params # ]) texes = [] str1 = "y=" for i in range(3): param = params[i] str1 += "{}cos(2\\pi x\\times {} ".format( param[0] if (param[0] != 1) else '', param[1]) if param[2] > 0: str1 += "+" else: str1 += "-" str1 += "{" + str(abs(param[2])) + "\\over 180}\\pi)" tex1 = TexMobject(str1) tex1.scale(0.6) tex1.set_y(3.5) texes.append(tex1) for k in range(6): str2 = "+" for i in range((k + 1) * 3, (k + 2) * 3): param = params[i] str2 += "{}cos(2\\pi x\\times {} ".format(param[0], param[1]) if param[2] > 0: str2 += "+" else: str2 += "-" str2 += "{" + str(abs(param[2])) + "\\over 180}\\pi)" if i % 3 < 2: str2 += "+" tex2 = TexMobject(str2) tex2.scale(0.6) tex2.set_y(2.5 - k) texes.append(tex2) str3 = "+\\cdots \\cdots \\cdots" tex3 = TexMobject(str3) tex3.scale(0.6) tex3.set_y(2.5 - 6) texes.append(tex3) g = VGroup(*texes) self.play(ShowCreation(g)) self.wait(2)
def construct(self): params = FFT_Song.getSongFormula("jojoVoice2.wav", 0) np_params = np.array(params) freq = np.array([0] * 4200) # 取前5000个频率及其对应强度 amplitudes = np.array([0] * 4200) for i in range(4200): p = params[i] freq[i] = p[1] amplitudes[i] = p[0] y_max = FRAME_Y_RADIUS x_max = FRAME_WIDTH self.camera.set_frame_center((x_max / 2, y_max / 2 + 1, 0)) self.camera.set_frame_height(y_max + 2) self.camera.set_frame_width(x_max + 1) axes = Axes( x_min=0, x_max=x_max + 0.5, y_min=0, y_max=y_max + 0.5, ) y_tex = TextMobject("强度") y_tex.set_x(0.5) y_tex.set_y(y_max) y_tex.scale(0.7) x_tex = TextMobject("频率") x_tex.set_x(x_max) x_tex.set_y(0.5) x_tex.scale(0.7) title_tex = TextMobject("原音频频谱") title_tex.set_stroke(MAROON_B, 1) title_tex.scale(0.7) title_tex.set_x(x_max / 2) title_tex.set_y(y_max) g = VGroup(axes, y_tex, x_tex, title_tex) g.shift((0, 1, 0)) max_freq = max(freq) max_amplitude = max(amplitudes) curve = VMobject() curve.set_points_smoothly([(freq[i] / max_freq * x_max, amplitudes[i] / max_amplitude * y_max, 0) for i in range(len(freq))]) numTexs = [] for i in range(14): num = 300 * (i + 1) numTex = TextMobject(str(num)) numTex.shift((i + 1, 0.7, 0)) numTex.scale(0.4) numTexs.append(numTex) numGroup = VGroup(*numTexs) curve.set_stroke(MAROON_B, 0.6) curve.shift((0, 1, 0)) self.play(ShowCreation(g)) self.play(ShowCreation(numGroup)) self.play(ShowCreation(curve)) self.wait(2) params = FFT_Song.getSongFormula("jo65_1100.wav", 0) freq = np.array([0] * 5000) # 取前5000个频率及其对应强度 amplitudes = np.array([0] * 5000) for i in range(5000): p = params[i] freq[i] = p[1] amplitudes[i] = p[0] curve2 = VMobject() curve2.set_points_smoothly([(freq[i] / max_freq * x_max, amplitudes[i] / max_amplitude * y_max, 0) for i in range(len(freq))]) curve2.shift((0, 1, 0)) curve2.set_stroke(GREEN_C, 0.6) title_tex2 = TextMobject("保留原音频65-1100Hz后的频谱") title_tex2.set_stroke(GREEN_C, 1) title_tex2.scale(0.7) title_tex2.set_x(x_max / 2) title_tex2.set_y(y_max + 1) self.play(Transform(curve, curve2), Transform(title_tex, title_tex2)) self.wait(2) params = FFT_Song.getSongFormula("jo270_3000.wav", 0) freq = np.array([0] * 5000) # 取前5000个频率及其对应强度 amplitudes = np.array([0] * 5000) for i in range(5000): p = params[i] freq[i] = p[1] amplitudes[i] = p[0] curve2 = VMobject() curve2.set_points_smoothly([(freq[i] / max_freq * x_max, amplitudes[i] / max_amplitude * y_max, 0) for i in range(len(freq))]) curve2.shift((0, 1, 0)) curve2.set_stroke(BLUE_E, 0.6) title_tex2 = TextMobject("保留原音频270-3000Hz后的频谱") title_tex2.set_stroke(BLUE_E, 1) title_tex2.scale(0.7) title_tex2.set_x(x_max / 2) title_tex2.set_y(y_max + 1) self.play(Transform(curve, curve2), Transform(title_tex, title_tex2)) self.wait(2)